MASM32汇编加法函数返回值始终为0的问题求助
解决你的Intel汇编加法函数输出始终为0的问题
嘿,作为汇编新手,你遇到的这个问题其实是参数传递和内存访问的典型误区——咱们一步步拆解:
问题根源
你的代码里有两个核心错误:
- 参数传递混淆了值和指针:你调用
fsum时用了addr temp1、addr temp2,传递的是这两个变量的内存地址,但函数里却直接把这些地址当成数值来相加,这完全不是你想要的“两个输入数值相加”。 - 错误的结果写入方式:原函数里的
mov z,eax根本没修改sum变量——z是栈上存储的sum的地址,你直接给z赋值只是修改了栈上的参数值,并没有把结果写入sum的内存位置,所以sum始终是初始的0。
修正方案(两种可选)
方案1:传递数值而非指针(更直观,适合新手)
修改函数调用,直接传递temp1和temp2的数值,sum依然传地址(因为要把结果写回去),然后在函数里正确写入结果到sum的内存:
; 修改后的函数调用 invoke fsum, temp1, temp2, addr sum ; 修改后的fsum函数 fsum PROC x:DWORD , y:DWORD , z:DWORD mov eax, x ; x是temp1的数值,直接加载到eax add eax, y ; 加上temp2的数值 mov [z], eax ; 通过z(sum的地址)把结果写入sum变量 ret fsum endp
方案2:保持传递指针,在函数里解引用
如果你想保持传递地址的方式,需要在函数里用[]来访问指针指向的内存数值:
; 函数调用不需要修改,依然是 invoke fsum, addr temp1, addr temp2, addr sum ; 修改后的fsum函数 fsum PROC x:DWORD , y:DWORD , z:DWORD mov eax, [x] ; 取出x指向的temp1的数值 add eax, [y] ; 加上y指向的temp2的数值 mov [z], eax ; 把结果写入z指向的sum变量 ret fsum endp
完整修正后的代码(以方案1为例,顺便修正了拼写错误)
.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 "Please enter second number ",0 ; 修正了拼写错误(Pleae→Please) 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, temp1, 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 ; 正确写入sum变量 ret fsum endp end start
为什么不调用函数时程序正常?
因为你直接用atodw得到数值后存在temp1和temp2,如果直接执行mov eax,temp1+add eax,temp2+mov sum,eax,操作的都是变量的数值,没有涉及指针和内存地址的混淆,所以能得到正确结果。
内容的提问来源于stack exchange,提问作者tiny rick
相关产品推荐
相关产品推荐

