x86汇编中以R和E开头的寄存器有什么区别?
E开头与R开头x86寄存器的核心区别
本质是CPU架构的差异
你在两个场景看到的寄存器命名不同,根源是调试的程序分别对应32位、64位两种x86 CPU架构:
- E开头寄存器:属于**32位x86架构(又称i386、IA32)**的命名规则,
E是英文*Extended(扩展)*的缩写,寄存器长度为32位(4字节)。你书中的示例就是32位程序的反汇编结果:地址是0x08048357这类8位十六进制值,刚好匹配32位的最大寻址空间。 - R开头寄存器:属于**64位x86架构(又称x86-64、AMD64)**的命名规则,
R是英文*Register(寄存器)*的缩写,寄存器长度为64位(8字节)。你在Manjaro中调试的是默认编译生成的64位程序:地址是0x000000000000118e这类16位十六进制值,匹配64位的寻址空间。
两者的兼容关系
64位x86架构是向下兼容32位指令的,同一个物理寄存器,用不同名称访问的是不同的比特段:
以栈基址指针寄存器为例:
- 用
rbp访问的是该寄存器完整的64位全部比特 - 用
ebp访问的是该寄存器低32位的比特 - 用
bp访问的是该寄存器低16位的比特
你在自己的GDB输出里同时看到了R开头的rbp和E开头的ecx/edx,就是因为代码里操作32位长度的整数时,编译器会直接调用32位子寄存器,操作64位数据时才会调用全宽的R开头寄存器。
如何复刻书中的调试效果
你的Manjaro是64位系统,gcc默认会把代码编译为64位程序,只要编译时加上-m32参数强制生成32位程序,调试时就能看到和书中一致的E开头寄存器输出了。
内容的提问来源于stack exchange,提问作者FLY FOX 2058
相关产品推荐
相关产品推荐

