【发布时间】:2014-05-26 05:50:08
【问题描述】:
我是 MASM 新手,在使用间接偏移和在堆栈上传递参数时遇到了一些麻烦。
我有一个排序数组,它的大小是我通过堆栈传递给过程的。我想打印数组的第一个和最后一个元素。我将这两个参数压入堆栈、数组第一个元素的偏移量和数组中的元素个数。
数组中的元素数量是正确的,但是当我尝试访问堆栈上的下一个位置 [arraysize pos + 4] 时,我得到一个巨大的数字,数组元素永远不会超过 900。如果有人能指出问题,可能很明显,对我来说,我将非常感激。提前谢谢你。
push OFFSET array
push arraySize
call displayRange
...
;------------------------------------
displayRange PROC
;------------------------------------
push ebp
mov ebp, esp
pushad ;save the registers
mov eax, [ebp + 8]
call WriteDec
mov edx, OFFSET range1_str
call WriteString
mov esi, [ebp + 12]
mov eax, [esi]
call WriteDec
mov edx, OFFSET range2_str
call WriteString
mov edx, TYPE array
mov eax, [ebp + 8]
mul edx
add eax, 12
mov esi, [ebp + eax]
mov eax, [esi]
call writeDec
mov edx, OFFSET range3_str
call WriteString
call Crlf
popad
pop ebp
ret 8
displayRange ENDP
#
UPDATE
#
要回答我自己的问题,我得到这么多数字的原因是因为我传递的是 ADDRESS 而不是实际的取消引用值。这是正确的代码:
;------------------------------------
displayRange PROC
;------------------------------------
push ebp
mov ebp, esp
pushad ;save the registers
mov eax, [ebp + 8]
call WriteDec
mov edx, OFFSET range1_str
call WriteString
mov esi, [ebp + 12]
mov eax, [esi]
call WriteDec
mov edx, OFFSET range2_str
call WriteString
mov edx, TYPE array
mov eax, [ebp + 8]
mul edx
add eax, 12
mov esi, [ebp + eax]
call writeDec
mov edx, OFFSET range3_str
call WriteString
call Crlf
popad
pop ebp
ret 8
displayRange ENDP
【问题讨论】: