【问题标题】:what are the purpose of different types of assembly registers?不同类型的汇编寄存器的目的是什么?
【发布时间】:2014-06-10 00:07:25
【问题描述】:

假设这是 AT&T 语法。

当有这样的问题时:

movl (%rdi), %ecx

%rdi%ecx 的用途是什么?

我理解mov(q,l,w,b)add(q,l,w,b)等概念。

我们可以写%rdx 而不是%rdi 吗?如果是这样,那会发生什么变化?为什么%rdi会存在?

【问题讨论】:

  • rdi 是一个实际的寄存器,与rdx 不同。 rdiedi的爸爸,di的爷爷,rsi的弟弟。 rdirsi 曾经代表目标和源索引寄存器,但现在通常可以像其他通用寄存器一样使用。但是,rdi 没有等效于 DX 的 8 位上半部分 (DH)。
  • 字面意思是不同的寄存器。如果我将某些内容存储到rdi,它不会存储在rdx 中,并且rdx 保持不变。这里:ntcore.com/files/vista_x64/x64_registers.jpg
  • 您是使用 Intel 架构 CPU 的受害者 - 他们在将不同的能力和功能归因于不同的寄存器方面一直臭名昭著,尽管它不再像以前那样糟糕,在之前386 次。
  • 它主要是历史性的,尽管一些指令仍然与特定的寄存器相关联,例如 movs... 其中 rsi (或 ds:esi) 包含源地址,而 rdi (或 es:edi) 是目的地址。循环指令使用 rcx / ecx。
  • 回到 8008,一个 8 位处理器,H 和 L 寄存器被组合用于 16 位寻址。只有8位累加器A。8088/8086发布时,翻译标准是A=>AL,B=>CH,C=>CL,H=>BH,L=>BL,D=> DH,E=>DL。添加了 SI 和 DI。 64 位模式只是将新的寄存器命名为 R8、R9、...。

标签: assembly cpu-registers


【解决方案1】:

x86_64 有 16 个通用寄存器。 8 个是从 x86 继承而来的(eax、ebx、ecx、edx、esi、edi、ebp、esp),8 个是全新的(r8 到 r15)。

在过去,寄存器具有非常特定的功能。

  • eax 是您主要进行算术运算的累加器寄存器
  • ebx 是用于计算内存地址的基址寄存器
  • ecx 是保存循环计数器的计数寄存器
  • edx 是可用于 I/O 端口访问的数据寄存器
  • edi 是目标索引寄存器,它指向字符串操作的“目标”
  • esi 是指向字符串操作“源”的源索引寄存器
  • ebp 是指向当前栈帧基址的基址指针。
  • esp 是堆栈指针。

最初,当指令集很小时,某些指令只能对某些寄存器进行操作。例如rep stos指令使用ECX作为计数器,将数据存储到EDI指向的内存中。

现在,像这样的专用指令并不常见,编译器现在使用的指令通常接受任何通用寄存器。因此,这些天来,您基本上可以将 CPU 视为具有 14 个几乎可以完全互换的寄存器(注意 ebpesp 仍然用作基指针和堆栈指针,并且通常不能用于其他目的) .

【讨论】:

  • 386 正交化(那个动词存在吗?)架构很多。因此,具有非常特定功能的寄存器是(在 8086 中)AX, BX, CX, DX, DI, SI, BP, SP, FLAGS, IP,其中一些继承了 8080 中一些寄存器的功能,这些寄存器继承自 8008。在 386+ 中,您几乎可以在任何地方使用任何寄存器。跨度>
  • 我对 386 的经验是,仍然有许多相当有用的操作码对寄存器有特定的限制。例如,IMUL 只在EDX:EAXREP 中产生结果,而朋友们只使用ECX 进行计数,还有一些由于时间的迷雾我已经忘记了。 x86_64 在这方面似乎更好,因为它在很多情况下都允许 r8-r15。
  • (并不是说 386 不是对 8086 的改进……读取 8086 汇编有点糟糕,因为隐式寄存器,而编写它更糟糕)。
  • (可以说 x86 已经从基于累加器的架构转变为基于寄存器文件的架构,8086 的累加器比它的前辈少(8080 的加法和减法总是在累加器上) ),并且 80386 是相对非常注册文件-y)。
猜你喜欢
  • 1970-01-01
  • 2017-08-20
  • 2017-06-15
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多