【问题标题】:What's the difference between "R" and "E" name of registers in Assembly [duplicate]汇编中寄存器的“R”和“E”名称有什么区别[重复]
【发布时间】:2021-11-24 10:34:44
【问题描述】:

我在书中有一个示例,其中包含主函数 prolog 的 GDB 输出:

0х08048357 <main+0> : push еbр
0х08048358 <main+l> : mov  ebp, esp
0х0804835а

但在我的系统(Manjaro linux)中,相同的代码和相同的 GDB 为我提供了类似的东西:

   0x000000000000118e <+0>:     push   rbp
   0x000000000000118f <+1>:     mov    rbp,rsp
   0x0000000000001192 <+4>:     mov    ecx,0x4
   0x0000000000001197 <+9>:     mov    edx,0x3
   0x000000000000119c <+14>:    mov    esi,0x2
   0x00000000000011a1 <+19>:    mov    edi,0x1

我想知道“R”和“E”起始寄存器有什么区别。需要“新手”解释。

【问题讨论】:

标签: assembly x86-64 cpu-registers


【解决方案1】:

简答:exx 寄存器是 32 位的,rxx 寄存器是 64 位的

更长的答案:x86 体系结构从最初的 16 位根源发展了数十年,当时 16 位寄存器被称为 axbx 等。当引入 80386 时,寄存器被扩展到32 位,因此称为eaxebx 等。在 80386 上引用旧的 16 位寄存器名称可访问这些扩展寄存器的低 16 位。 AMD 在将 x86 指令集架构扩展为 64 位时,选择了 'r' 作为 64 位寄存器的前缀,再次将 32 位寄存器扩展为raxrbx 等。添加了一些以前不存在的新寄存器,r8-r15。

【讨论】:

  • 我们在What do the E and R prefixes stand for in the names of Intel 32-bit and 64-bit registers? 上已经有了这样的规范答案。如果您要专门回答这个问题而不是作为副本关闭,那么相关的事情就是提到这本书显然是为 32 位系统编写的,但被问者使用的是现代 x86-64 系统,其中GCC 默认为 -m64,而 gcc -m32 -fno-pie -no-pie -fno-stack-protector 可能会使 asm 更接近带有 GCC 配置的旧系统。
猜你喜欢
  • 1970-01-01
  • 2012-01-28
  • 2017-10-11
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 2012-02-10
  • 2021-08-11
相关资源
最近更新 更多