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