假设这是AT& T语法。
当出现如下问题时:
movl (%rdi), %ecx
%rdi
或%ecx
的目的是什么?
我理解mov(q,l,w,b)
或add(q,l,w,b)
等概念。
我们可以写%rdx
代替%rdi
吗?如果是这样,会有什么变化?为什么%rdi
存在?
答案 0 :(得分:7)
x86_64有16个通用寄存器。 8从x86(eax,ebx,ecx,edx,esi,edi,ebp,esp)继承,8是全新的(r8到r15)。
在过去的几天里,寄存器具有非常特殊的功能。
eax
是您主要执行算术的累加器寄存器ebx
是进行内存地址计算的基本寄存器ecx
是持有循环计数器的计数寄存器edx
是您可以用于I / O端口访问的数据寄存器edi
是目标索引寄存器,它指向" destination"一个字符串操作esi
是源索引寄存器,它指向" source"一个字符串操作ebp
是指向当前堆栈帧基础的基指针。esp
是堆栈指针。最初,当指令集很小时,某些指令只能用某些寄存器操作。例如,rep stos
指令使用ECX
作为计数器,并将数据存储到EDI
指向的内存中。
如今,像这样的专门指令并不常见,编程器现在使用的指令通常接受任何通用寄存器。所以,现在,您基本上可以将CPU视为具有14个几乎完全可互换的寄存器(请注意ebp
和esp
仍然用作基指针和堆栈指针,并且通常不可用用于其他目的)。