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
相关产品推荐
相关产品推荐

