如何知道寄存器是否是"通用寄存器"?

use*_*277 3 x86 assembly

我试图了解寄存器必须被称为"通用寄存器"的标准.

我认为通用寄存器是一个寄存器,可以用于任何事情(用于计算,向/从它移动数据等),并且是一个没有特殊用途的寄存器.

现在我已经读到ESP寄存器是通用寄存器.我想ESP寄存器可以用于任何东西,但ESP寄存器也有一个特殊的用途,即指向堆栈的顶部.

这是否意味着ESP寄存器是一个特殊目的寄存器?

zx4*_*485 12

术语通用寄存器(GPR)与专用寄存器形成对比.后者不能在所有情况下使用.

从历史上看,旧的8086架构为其名称中存在的整数寄存器引入了这种差异,直到今天:

  • AX = A ccumulator寄存器:累加结果(**)
  • BX = B ase寄存器:某些指令的基本偏移量,例如XLAT
  • CX = C ounter寄存器:循环计数,例如JCXZ.
  • DX = D ata寄存器:扩展数据范围,例如MUL的结果在DX:AX中
  • SI = 小号乌尔斯河指数:源串指令,例如LODSB
  • DI = D estination index:字符串指令的目的地,例如STOSB
  • SP = S大头针指针:指向堆栈的当前项
  • BP = B ase指针:指向当前子程序的基数(堆栈帧)

(**)AX/AL也是某种专用寄存器.许多指令对AX/AL都有特殊的编码作为操作数,例如用MOV加载段寄存器.

其他特殊目的寄存器是

  • 段寄存器(CS,DS,ES,SS)
  • 标志注册(FLAGS)和
  • 指令指针(IP)

其中一些限制在实际模式下用于16位指令的寻址模式直到今天仍在使用(参见英特尔®64和IA-32架构软件开发人员手册第2卷第2.1.5节,表2-1.使用ModR/M字节的位寻址表单")


随着32位架构(IA-32)的引入,整数寄存器的通用和(几乎)每个寄存器的用途可用于各种目的(因此通用).这也反映在指令的寻址模式编码中,参见英特尔手册第2卷第2.1.5节,表2.2.(比较表2.1和表2.2以了解差异)

这些名称分别以E和R为前缀加上EAX和RAX,它们的历史名称表明其使用现在仅仅是传统的.

随着许多新架构的出现,新增了专用寄存器.英特尔手册第1卷第3.7.2节给出了完整的概述.:

  • 32位通用寄存器(EAX,EBX,ECX,EDX,ESI,EDI,ESP或EBP)
  • 16位通用寄存器(AX,BX,CX,DX,SI,DI,SP或BP)
  • 8位通用寄存器(AH,BH,CH,DH,AL,BL,CL或DL)
  • 段寄存器(CS,DS,SS,ES,FS和GS)
  • EFLAGS注册
  • x87 FPU寄存器(ST0到ST7,状态字,控制字,标记字,数据操作数指针和指令指针)
  • MMX寄存器(MM0到MM7)
  • XMM寄存器(XMM0到XMM7)和MXCSR寄存器
  • 控制寄存器(CR0,CR2,CR3和CR4)和系统表指针寄存器(GDTR,LDTR,IDTR和任务寄存器)
  • 调试寄存器(DR0,DR1,DR2,DR3,DR6和DR7)
  • MSR注册

甲通用寄存器是一个可用于一个以上的目的.这些目的是

  • 值
  • 解决
  • 索引
  • (数数)
  • (基础)

甲段寄存器,例如只能容纳一个段值,但不能在加成中使用.和FPU寄存器只能容纳一个浮动点值,但不能用于寻址.

在IA-32中,ESP寄存器更接近于通用寄存器,因为它可用于(几乎)所有上述目的:

  • 作为价值: mov eax, esp
  • 在寻址:mov eax, [esp+4],但不像(缩放)索引一样mov eax, [4+esp*2]
  • 作为基础: mov eax, [esp + eax]
  • 作为计数:inc esp在跳转有效之前

唯一的例外ESP是(缩放的)索引寻址无法编码.它只能用作基本寄存器,该寄存器使用SIB字节进行异常编码(参见英特尔手册,第2卷,第2.1.5节,表2.3 - 见页脚).

为了说明ESP和其他寄存器(例如ECX)之间的编码差异:

8b 01         mov eax, [ecx]   ; MOV + ModRM (normal)
8b 04 24      mov eax, [esp]   ; MOV + ModRM + SIB byte
8b 41 04      mov eax, [ecx+4] ; MOV + ModRM + disp8
8b 44 24 04   mov eax, [esp+4] ; MOV + ModRM + SIB + disp8
Run Code Online (Sandbox Code Playgroud)

我想尽管如此,一个例外ESP仍然可以算作GPR.