如何让NASM生成带符号扩展16位立即数的push指令编码?
NASM在64位模式下为何默认不生成16位push立即数编码?
问题还原
在64位模式下汇编以下代码:
BITS 64 push 32767
得到的机器码是68 ff 7f 00 00,对应32位的push dword指令,而非更短的16位编码。
核心原因
- x86-64架构的默认行为:64位模式下,NASM对
push立即数的默认处理是生成32位编码——因为32位立即数会自动零扩展为64位,这是x86-64架构的标准规则,能适配绝大多数64位程序的需求,保证操作结果符合64位环境的预期。 - 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
相关产品推荐
相关产品推荐

