2016-05-03 5 views
2

Я пытаюсь передать 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 

ответ

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

Благодарим вас за ответ. Когда я вызываю «вызов PutDDec», результат не является добавлением. Вы знаете причину этого? Спасибо – user190494

+0

Мы не знаем, как 'PutDDec' ожидает аргумент, может быть, он тоже хочет этого в стеке. Добавление 'mov [esp], eax' до' call PutDDec' может стоить попробовать. – Jester

+0

PutDDec печатает десятичную версию регистра EAX – user190494

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].

Также, как отметил Джоттер в своем более подробном ответе, вам не нужен локальный var, чтобы сделать сумму.

0

я смог чтобы программа работала с использованием точечной части базового указателя, поскольку я нажимал 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 помог вам! –