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

如何让NASM生成带符号扩展16位立即数的push指令编码?

NASM在64位模式下为何默认不生成16位push立即数编码?

问题还原

在64位模式下汇编以下代码:

BITS 64
push 32767

得到的机器码是68 ff 7f 00 00,对应32位的push dword指令,而非更短的16位编码。

核心原因

  1. x86-64架构的默认行为:64位模式下,NASM对push立即数的默认处理是生成32位编码——因为32位立即数会自动零扩展为64位,这是x86-64架构的标准规则,能适配绝大多数64位程序的需求,保证操作结果符合64位环境的预期。
  2. 16位指令属于遗留操作:16位的push立即数是16位模式的遗留指令,在64位模式下使用需要显式指定操作数大小。NASM不会自动选择16位编码,因为它默认假设开发者需要的是适配64位环境的通用操作,而非针对16位数据的特殊处理。

如何生成16位编码

如果确实需要生成更短的16位push指令,必须显式声明操作数大小:

BITS 64
push word 32767

此时NASM会生成机器码66 68 ff 7f,对应16位的push word指令,仅占用4字节(前缀+立即数),栈上也只存储2字节数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:10:59