Intel 汇编程序使用函数

Intel Assembly program using function

我是汇编的新手,一直坚持使用这个程序,其中使用了一个简单的加法函数,它接受两个输入并给出总和。 我现在得到的输出总是 0。 我认为这与数据类型的处理方式有关。 感谢任何帮助。

注意:程序在没有函数的情况下工作正常

.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib



.data

msg1 db "Please enter first number ",0
msg2 db "Pleae enter second number ",0
input1 db 10 DUP(0)
input2 db 10 DUP(0)
sum dword 0
sums db 10 DUP(0)
msg3 db "The sum of your numbers is :",0
temp1 dword     0
temp2 dword     0



fsum PROTO :dword, :dword, :dword

.code


start:

    invoke StdOut , addr msg1
    invoke StdIn , addr input1,10
    invoke StdOut , addr msg2
    invoke StdIn , addr input2,10


    ;Strip CRLF
    invoke StripLF, addr input1
    invoke StripLF, addr input2


    ;string to int

    invoke atodw, addr input1
    mov temp1,eax
    invoke atodw , addr input2
    mov temp2,eax

    ;Function CALL
    invoke fsum, addr temp1,addr temp2,addr sum




    ;int to string
    invoke dwtoa,sum, addr sums

    ;Printing OUTPUT
    invoke StdOut, addr msg3
    invoke StdOut, addr sums

    invoke ExitProcess, 0

    ;Function Definition

    fsum PROC x:DWORD , y:DWORD , z:DWORD

    mov eax,x
    add eax,y
    mov z,eax

    ret
    fsum endp

end start

按地址传递前两个参数没有意义。当您只能 return 结果时,拥有输出参数也没有任何实际意义。

所以更合理的做法是:

invoke fsum, temp1, temp2
; The sum is now in eax

...

fsum PROC x:DWORD , y:DWORD
    mov eax,x
    add eax,y
    ret 
fsum endp

如果您绝对坚持要有一个输出参数,您仍然需要进行一些小的更改:

; First two arguments are passed by value; last one by address
invoke fsum, temp1,temp2,addr sum

...

fsum PROC x:DWORD , y:DWORD , z:DWORD
    mov eax,x
    add eax,y
    mov edx,z       ; Get the address to write to
    mov [edx],eax   ; ..and write to it.
    ret
fsum endp