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

NASM汇编MOVZX目标为16位时的源大小选择及输出异常问询

关于movzx指令行为的解释

首先明确:x86指令集里根本没有“16位源操作数→16位目标操作数”的movzx指令,movzx的设计逻辑是把更窄的操作数零扩展到更宽的目标,合法的组合只有:

  • 8位→16位
  • 8位→32位
  • 16位→32位

你写的movzx ax, [n1]里,目标ax是16位,按照指令集规则,源操作数只能是8位。但你的n1是dw定义的16位变量,这时候NASM会默认把[n1]解析为字节寻址(即byte [n1]),只读取n1的低字节0x34,然后零扩展到16位的ax中,所以ax的值变成0x0034。

而之前的mov ax, [n1]是正常的16位加载操作,会读取整个n1的16位值0x1234到ax里。再加上你一开始用xor eax, eax把eax清零了,所以两种情况的eax分别是0x00000034(十进制52)和0x00001234(十进制4660),这就是输出不同的原因。

如果想要对16位的n1做零扩展,正确的写法应该是movzx eax, word [n1],这样会把16位的0x1234零扩展到32位的eax,结果和原来的mov ax, [n1]效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:03:34