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

时间:2017-08-07 00:46:24

标签: assembly x86

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

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

现在我已经读过ESP寄存器是一个通用寄存器。我想ESP寄存器可用于任何事情,但ESP寄存器也有一个特殊用途,即指向堆栈的顶部。

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

2 个答案:

答案 0 :(得分:12)

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

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

  • AX = A ccumulator寄存器:累积结果(**)
  • BX = B ase寄存器:某些指令的基本偏移,例如XLAT
  • CX = C ounter register :对循环进行计数,例如: JCXZ
  • DX = D ata寄存器:扩展数据范围,例如: MUL的结果在DX:AX
  • SI = S 源索引:字符串指令的来源,例如LODSB
  • DI = D estination index :字符串指令的目的地,例如STOSB
  • SP = S 大头针指针:指向堆栈的当前项目
  • BP = B ase指针:指向当前子程序的基础(堆栈框架)
  

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

其他特殊目的寄存器

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

直到今天,在实模式中的16位指令的寻址模式中使用了其中一些限制(参见Intel® 64 and IA-32 Architectures Software Developer’s Manual第2卷第2.1.5节,表2-1 。“带ModR / M字节的16位寻址表”)

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

名称的前缀分别为 E R ,分别为 EAX RAX 表明用法的历史名称现在仅仅是传统的。

随着许多新架构的出现,新增了专用寄存器。 Intel手册,第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

我猜尽管有一个例外ESP仍然可以将自己算作 GPR

答案 1 :(得分:2)

x86中的每个通用寄存器也被某些指令隐式使用,因此也是专用寄存器。这里只是每个寄存器的一个例子,但还有更多的例子 eax:mul
ebx:xlat
ecx:shl
edx:div
edi:stos
esi:lods
ebp:离开
esp:ret