64位处理器下GNU汇编movq %rsp,%rax为何仅生成3字节指令?
x86-64指令长度与解码疑问解答
核心结论
CPU不会把这条3字节的movq %rsp,%rax指令填充成8字节。x86-64属于变长指令集,指令长度范围是1到15字节,处理器会根据指令的操作码及后续字段自动识别实际长度,完全不需要额外填充字节。
指令字节拆解
你看到的48 89 e0三个字节各自的作用:
48:REX前缀,用来开启64位操作模式,指定操作数为64位寄存器89:MOV指令的基础操作码,代表将源寄存器的值移动到目标寄存器e0:ModRM字段,编码了源寄存器%rsp和目标寄存器%rax
这条指令已经完整实现了movq %rsp,%rax的操作逻辑,没有任何缺失,处理器解码时会直接按这3字节解析执行,不会额外补0。
误区澄清
你误以为64位指令都是8字节,是混淆了寄存器宽度和指令长度两个概念:
- 64位指的是处理器通用寄存器的宽度(比如
%rax是64位),以及支持64位数据处理 - 而指令本身的长度由x86-64指令集的编码规则决定,变长设计的目的是在保证功能的前提下尽量压缩指令体积,提升缓存命中率和执行效率
内容的提问来源于stack exchange,提问作者Towa
相关产品推荐
相关产品推荐

