我试图了解寄存器必须被称为"通用寄存器"的标准.
我认为通用寄存器是一个寄存器,可以用于任何事情(用于计算,向/从它移动数据等),并且是一个没有特殊用途的寄存器.
现在我已经读到ESP寄存器是通用寄存器.我想ESP寄存器可以用于任何东西,但ESP寄存器也有一个特殊的用途,即指向堆栈的顶部.
这是否意味着ESP寄存器是一个特殊目的寄存器?
zx4*_*485 12
术语通用寄存器(GPR)与专用寄存器形成对比.后者不能在所有情况下使用.
从历史上看,旧的8086架构为其名称中存在的整数寄存器引入了这种差异,直到今天:
(**)AX/AL也是某种专用寄存器.许多指令对AX/AL都有特殊的编码作为操作数,例如用MOV加载段寄存器.
其他特殊目的寄存器是
其中一些限制在实际模式下用于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, espmov 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.
| 归档时间: |
|
| 查看次数: |
1109 次 |
| 最近记录: |