通过堆栈将参数传递给MASM中的过程

时间:2016-05-03 20:14:15

标签: assembly masm masm32

我正在尝试将3个参数传递给过程,添加它们,然后将它们返回到MASM的税务登记册中。然而,结果是随机的大数字。我正在尝试使用C样式调用约定,我将3个变量传递给函数。我究竟做错了什么?这是我的代码:

INCLUDE PCMAC.INC


.MODEL SMALL
.586
.STACK 100h
.DATA

.CODE
        EXTRN  GetDec :NEAR, PutDDec : NEAR, PutHex : NEAR
Main PROC
        _Begin
        push 10
        push 20
        push 30

        call Test1


        call PutDDec
        add esp, 12

        _Exit
Main ENDP
Test1 PROC
    ; *** Standard subroutine prologue ***
    push ebp
    mov ebp, esp
    sub esp, 4
    push edi
    push esi

    ; *** Subroutine Body ***

    mov eax, [ebp+8] ; parameter 1 / character
    mov esi, [ebp+12] ; parameter 2 / width
    mov edi, [ebp+16] ; parameter 3 / height

    mov [ebp-4], edi
    add [ebp-4], esi
    add eax, [ebp-8]
    add eax, [ebp-4]

    ; *** Standard subroutine epilogue ***
    pop esi ; Recover register values
    pop edi
    mov esp, ebp ; Deallocate local variables
    pop ebp ; Restore the caller’s base pointer value

    ret
Test1 ENDP
End Main

3 个答案:

答案 0 :(得分:3)

  

我做错了什么?

您没有对代码发表评论,也没有使用调试器。

mov [ebp-4], edi
add [ebp-4], esi
add eax, [ebp-8] ; <---- what is this ebp-8 here?
add eax, [ebp-4]

要添加3个数字,您只需要添加2个,为什么有3个? 你甚至不需要使用局部变量,你可以这样做:

push ebp
mov ebp, esp

mov eax, [ebp+8] ; parameter 1 / character
add eax, [ebp+12] ; parameter 2 / width
add eax, [ebp+16] ; parameter 3 / height

mov esp, ebp ; Deallocate local variables
pop ebp ; Restore the caller’s base pointer value

ret

或者,如果您不需要堆栈帧,那么只需:

mov eax, [esp+4]
add eax, [esp+8]
add eax, [esp+12]
ret

答案 1 :(得分:0)

子例程主体中,三个参数的总和可以这样完成:

mov [ebp-4], edi   ;Move EDI into your local var
add [ebp-4], esi   ;Add ESI into your local var
add eax, [ebp-4]   ;Finally, add the contents of your local var into EAX
                   ;(note that EAX contains first param) 

你的错误发生在[ebp-8]

同样,杰斯特在更全面的回答中指出,你真的不需要一个本地的变量来做总和。

答案 2 :(得分:0)

我能够通过使用基指针的ax部分来使程序工作,因为我正在推动2 DB,而不是DW:

INCLUDE PCMAC.INC


.MODEL SMALL
.586
.STACK 100h
.DATA
sum DWORD ?

.CODE
        EXTRN  GetDec :NEAR, PutDec : NEAR, PutHex : NEAR
Main PROC
        _Begin
        push 10
        push 20

        call Test12
        ;and eax, 0ffffh

        call PutDec

        _Exit
Main ENDP
Test12 PROC
    push bp
    mov bp, sp

    mov ax, [bp+6] ;
    add ax, [bp+4] ;

    pop bp
    ret 4
Test12 ENDP
End Main