【发布时间】: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不同。rdi是edi的爸爸,di的爷爷,rsi的弟弟。rdi和rsi曾经代表目标和源索引寄存器,但现在通常可以像其他通用寄存器一样使用。但是,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、...。