x86 AT&T语法下4字节mov加载多word:%eax结果为何与预期不符?
x86 AT&T语法mov指令操作疑问解答
你的错误核心是对汇编器处理操作数大小的逻辑理解偏差,具体拆解如下:
汇编器会依据源操作数的类型选择指令
你定义的x是.word类型(16位数据),当编写mov x, %eax时,汇编器不会直接读取4字节内存,而是根据x的16位属性,自动将指令转换为16位到32位的扩展加载指令。因为x的值是0x0001(无符号正数),汇编器会选择movzwl(零扩展加载):仅读取x对应的2字节内存(小端存储为01 00),再将这16位值零扩展为32位,最终存入%eax的结果就是0x00000001(即你调试看到的0x1)。错误的内存读取范围假设
你误以为mov会按目标寄存器%eax的4字节大小读取内存(包含x和y的4字节数据),但实际上汇编器会严格遵循源操作数的类型定义来确定读取长度——.word类型只会触发2字节读取,而非4字节。实现预期结果的正确写法
如果你确实想读取x起始的4字节内存到%eax,需要显式指定读取32位数据,写法如下:movl x, %eax # 显式添加l后缀,强制读取4字节此时会读取
x和y的4字节数据(01 00 00 00),按小端序解析后得到0x00000100,和你最初的预期一致。
内容的提问来源于stack exchange,提问作者Mr. Sir
相关产品推荐
相关产品推荐

