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

问题描述:

我正在尝试将3个参数传递给过程,添加它们并将它们返回到MASM中的纳税注册表中。然而,结果是一个随机的数字。我正在尝试使用C风格的调用约定,我将3个变量传递给一个函数。我究竟做错了什么?这里是我的代码:将参数通过堆栈传递给MASM中的过程

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 

我在做什么错?

你没有评论你的代码,你没有使用调试器。

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 
+0

谢谢您的回答。当我打电话给“打电话PutDDec”时,结果不是加法。你知道这个的原因吗?谢谢 – user190494

+0

我们不知道'PutDDec'如何期待这个论点,也许它也想要这个论点。在调用PutDDec之前添加'mov [esp],eax'值得一试。 – Jester

+0

PutDDec打印出EAX寄存器的十进制版本 – user190494

在你子程序中,这三个参数的总和可以这样进行:

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]

另外,正如Jester在他的更彻底的答案中指出的,你不需要一个局部变量来完成总和。

我能通过使用基本指针的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 
+1

我好像错过了你的答案。它属于你的其他/后面的问题:“MASM:如何通过引用传递价值”。接受你自己的答案也不是很好,同时@Jester帮你解决了问题! –