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

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

修正逻辑说明

  1. 先从栈上的var参数中读取num1的真实内存地址
  2. 通过该地址访问num1的实际内存空间,写入新值6
  3. 此时main中读取num1时,就能获取到修改后的结果6

内容的提问来源于stack exchange,提问作者Learner_51

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:56:03