Я пытаюсь передать 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 ответа
Что я делаю не так?
Вы не комментировали свой код и не использовали отладчик.
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
Мне удалось заставить программу работать, используя часть 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
В вашем теле подпрограммы сумма трех параметров может быть сделана следующим образом:
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, чтобы сделать сумму.
Похожие вопросы
Новые вопросы
assembly
Вопросы по языку ассемблера. Отметьте процессор и/или набор инструкций, которые вы используете, а также ассемблер, допустимый набор должен быть таким: ([assembly] [x86] [gnu-assembler] или [att]). Вместо этого используйте тег [.net-assembly] для сборок .NET, [cil] для языка ассемблера .NET и вместо байт-кода Java используйте тег java-bytecode-asm.