MASM中使用ADDR运算符传递变量地址修改原值失败问题
问题分析与修正
你的代码核心问题出在modify函数对参数的处理逻辑上:
- 用
ADDR num1传递的是变量num1的内存地址,这个地址被存在栈上的var参数位置 - 直接执行
mov [var], eax时,实际是把6写入了栈上的var参数本身,而非var存储的地址指向的num1内存,所以num1的值根本没被修改
修正后的完整代码
.386 .model flat, stdcall .stack 4096 ExitProcess proto, dwExitCode:dword include Irvine32.inc .data num1 dword 2 .code modify PROC var : DWORD mov eax, var ; 取出num1的内存地址到eax寄存器 mov dword ptr [eax], 6 ; 通过地址修改num1的原始值 ret modify endp main proc invoke modify, addr num1 mov eax, num1 call WriteDec call Crlf invoke ExitProcess, 0 main endp end main
也可以用ebx寄存器中转(简单场景无需额外保护寄存器):
modify PROC var : DWORD mov ebx, var mov eax, 6 mov [ebx], eax ret modify endp
修正逻辑说明
- 先从栈上的
var参数中读取num1的真实内存地址 - 通过该地址访问
num1的实际内存空间,写入新值6 - 此时
main中读取num1时,就能获取到修改后的结果6
内容的提问来源于stack exchange,提问作者Learner_51
相关产品推荐
相关产品推荐

