堆栈参数偏移问题MASM

时间:2014-05-21 13:55:20

标签: x86 intel masm

我是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

1 个答案:

答案 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]