Intel x86_64架构64位模式下push r16指令编码正确性咨询
x86_64 64位模式下push指令相关疑问解析
push word register (r16) 编码错误说明
你指出的Intel联合手册(2023年6月版,订单号325462-080US,第2D卷附录B,B-28页表B-15)中将push word register编码为0x55是明显错误的:
0x55是固定对应push rbp的单字节指令,属于x86基础的单字节寄存器push指令(编码规则为0x50 + reg,其中reg=5对应rbp),该编码在任何模式下都不会被解析为push 16位寄存器操作。- 在64位模式下,要实现push 16位寄存器的操作,必须使用操作数大小前缀
0x66,搭配通用的push r/m16编码。例如:- push ax 的编码为
0x66 0x50 - push bx 的编码为
0x66 0x53
通用编码格式为0x66 0x50 + reg,其中reg对应目标16位寄存器的编号。
- push ax 的编码为
push imm64 指令的存在性纠正
“不存在push imm64指令”的说法不正确,x86_64的64位模式下原生支持push 64位立即数,有两种编码形式:
- 完整64位立即数:使用
0x48 0x68+ 8字节立即数,其中0x48是REX.W前缀,用于将push imm32指令(0x68)的操作数大小提升为64位,直接压入完整的8字节立即数。 - 紧凑格式(适用于可8位符号扩展的64位立即数):使用
0x48 0x6A+ 1字节立即数,REX.W前缀配合push imm8指令(0x6A),将8位立即数符号扩展为64位后压栈。
内容的提问来源于stack exchange,提问作者YutakaAoki
相关产品推荐
相关产品推荐

