我是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
答案 0 :(得分:1)
而不是:
mov edx, TYPE array
mov eax, [ebp + 8]
mul edx
add eax, 12
mov eax, [ebp + eax]
写:
mov edx, TYPE array
mov eax, [ebp + 8]
mul edx
add eax, [ebp+12]
mov eax, [eax]