期限通用寄存器(探地雷达)与特殊用途寄存器。后者不能在所有情况下使用。
从历史上看,旧的 8086 架构为名称中出现的整数寄存器引入了这种差异,直到今天:
- AX = A累加器寄存器: 累加结果(**)
- BX = BASE寄存器:某些指令的基址偏移量,例如XLAT http://felixcloutier.com/x86/XLAT:XLATB.html
- CX = C计数器寄存器:循环计数,例如JCXZ http://felixcloutier.com/x86/Jcc.html.
- DX = DATA寄存器:扩展数据范围,例如的结果MUL http://felixcloutier.com/x86/MUL.html位于 DX:AX
- SI = S来源索引:字符串指令的来源,例如LODSB http://felixcloutier.com/x86/LODS:LODSB:LODSW:LODSD:LODSQ.html
- DI = D目的地索引:字符串指令的目的地,例如STOSB http://felixcloutier.com/x86/STOS:STOSB:STOSW:STOSD:STOSQ.html
- SP = S定位指针: 指向堆栈的当前项
- BP = BASE指针:指向当前子程序的基址(堆栈帧)
(**) AX/AL 也是某种特殊用途寄存器。许多指令都有 AX/AL 作为操作数的特殊编码,例如加载段寄存器MOV http://felixcloutier.com/x86/MOV.html.
Other 特殊用途寄存器 were
- 段寄存器(CS、DS、ES、SS)
- 标志寄存器(FLAGS)和
- 指令指针(IP)
其中一些限制至今仍在 16 位指令的寻址模式中使用。实模式 (See 英特尔® 64 和 IA-32 架构
软件开发人员手册 https://software.intel.com/en-us/articles/intel-sdm第 2 卷,第 2.1.5 节,表 2-1。 “ModR/M 字节的 16 位寻址形式”)
随着 32 位架构 - IA-32 的引入,整数寄存器的用途得到了扩展,并且(几乎)每个寄存器都可以用于每种用途(因此是通用用途)。这也反映在指令的寻址模式编码中,请参见英特尔手册第 2 卷,第 2.1.5 节,表 2.2。 (比较表2.1和表2.2以了解差异)
这些名称带有前缀E and an R to EAX and 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寄存器
A 通用寄存器是一种可以用于多种目的的产品。这些目的是
- value
- 寻址
- indexing
- (数数)
- (base)
A 段寄存器例如,只能保存段值,但不能用于加法。还有一个FPU寄存器只能保存浮点值,但不能用于寻址。
在 IA-32 中ESP寄存器更接近于通用寄存器因为它可以用于(几乎)所有上述目的:
- 作为值:
mov eax, esp
- 在寻址中:
mov eax, [esp+4]
, but notas(缩放的)索引,如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.