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

MASM编写x86汇编时MOV指令未完整复制EAX寄存器至内存的问题

问题原因及修复方案

核心原因

  • 16位实模式的操作数限制:你采用.model small模型并给所有段指定了USE16属性,程序运行在DOS的16位实模式下。虽然.386伪指令允许使用EAX这类32位寄存器,但16位模式下内存访问的默认操作数宽度是16位。MOV [EDI], EAX这条指令未显式声明操作数大小,MASM会默认按16位处理——仅将EAX的低16位(AX寄存器内容)写入内存,同时还会错误地将EAX的高16位清零,这就是内存仅前两字节正确、后续两字节和EAX高16位为0的原因。
  • 变量类型不匹配:ARRAY被定义为DB(字节型数组),汇编器默认会按字节或16位宽度处理对它的写入操作,无法识别你要写入32位数据,进一步加剧了数据截断问题。

修复方案

要完整写入32位值到内存,只需修改写入指令,显式指定操作数为4字节:

MOV DWORD PTR [EDI], EAX

另外注意,你的MAIN PROC过程末尾缺少RET指令,虽然这不是当前问题的根源,但会导致程序执行流程异常,建议在写入指令后添加RET。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:55:18