You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:25:33