「Intel 80×86」- 寄存器(学习笔记)

Register,寄存器,在 CPU 中的存储电路,功能类似于在机器语言中的变量。

16-bit(8086, 8088, … 80286)

通用寄存器(General-Purpose Registers)

general-purpose registers (GPRs)

idxRegister16-bit (15-00)08-bit (15-08)08-bit (07-00)Descripton
1AccumulatorAXAHAL累加 寄存器
2CounterCXCHCL计数 寄存器
3DataDXDHDL数据 寄存器
4BaseBXBHBL基址 寄存器

对于在表中的 08-bit 寄存器(AH, AL, …),以 16-bit AX 为例:
1)0-7 为低 8 位,称为 AL;在汇编语言中,可以“使用 AH 寄存器”
2)8-15 为高 8 位,称为 AH;在汇编语言中,可以“使用 AL 寄存器”

因此,在 16-bit CPU 中,只有这 4 个通用寄存器。

每个寄存器为 16 位,因此存储 16 位二进制数。以前为 8 位,现在名称后缀 X 表示 extend 为 16 位。这 8 个寄存器共计 16 字节。

如上顺序是按照在机器语言中寄存器的编号进行排序的。

AX 用于计算,会使机器语言会更简洁:
1)ADD CX, 0x1234 => 81 C1 34 12
2)ADD AX, 0x1234 => 05 34 12

CX 方便计数而设计,BX 则适合作为计算内存地址的基点。

寻址寄存器(Index registers)

address registers, index registers

idxRegister16-bit (15-00)08-bit (15-08)08-bit (07-00)Descripton
5Stack PointerSP SPL栈指针 寄存器
6Stack Base PointerBP BPL基址指针 寄存器
7Source IndexSI SIL源变址 寄存器
8Destination IndexDI DIL目的变址 寄存器

在 16-bit CPU 中,寄存器 SP、BP、SI、DI 没有高位与地位之分,该处理器就是这么设计的。如果要取高位或地位,需要 MOV AX, SI 之后,在 AL、AH 来取值。

段寄存器(Segment Registers)

segment registers

idx名称英文中文
1SSStack Segment栈段 寄存器
2CSCode Segment代码段 寄存器
3DSData Segment数据段 寄存器
4ESExtra Segment附加段 寄存器

程序计数器(Program counter)

program counter

idx名称英文中文
1IPInstruction Pointer程序计数器

标志寄存器(Status register)

Status register, FLAGS

idx名称英文中文
1FlagsFlags register程序计数器

标志寄存器只有一个,16 bit,下面是各位字段的含义:

名称简称=1=0描述
00Carry flagCFCY(Carry)NC(No Carry)在指令执行过程中,是否向 最高有效位的更高位 借位或进位。该标志位用于无符号数运算。
01     
02Parity flagPFPE(Parity Even)PO(Parity Odd)在指令执行结果中,壹的个数是否为偶数。
03     
04Adjust flagAFAC(Auxiliary Carry)NA(No Auxiliary Carry) 
05     
06Zero flagZFZR(Zero)NZ(Not Zero)指令执行结果是否为零。
07Sign flagSFNG(Negative)PL(Positive)指令执行结果是否为负数。
08Trap flagTF   
09Interrupt enable flagIFEI(Enable Interrupt)DI(Disable Interrupt)在指令执行过程中,是否处理可屏蔽中断。
10Direction flagDFDN(Down)UP(Up)控制字符串的处理方向
11Overflow flagOFOV(Overflow)NV(Not Overflow)在指令执行过程中,是否发生溢出。该标志位用于有符号数运算。
12     
13     
14     
15     

32-bit(80386, …)

通用寄存器(General-Purpose Registers)

INDEXRegister32-bit (31-00)16-bit (15-00)08-bit (15-08)08-bit (07-00)Descripton
1AccumulatorEAXAXAHAL累加 寄存器
2CounterECXCXCHCL计数 寄存器
3DataEDXDXDHDL数据 寄存器
4BaseEBXBXBHBL基址 寄存器

对于 32-bit 寄存器,前缀 E 表示 Extend 扩展。即使在实模式(Real Mode)下,也可以使用这些寄存器(这就是兼容)。

以 EAX 寄存器为例:
1)在 EAX 中,寄存器为 32 位,低 16 位与 AX 共用,而高 16 位没有名称也没有编号(因此不能使用)。
2)EAX 可以作为两个 16 位寄存器使用,但是只有低 16 位方便使用,需要将高 16 位移动到低 16 位来使用。
3)另外,低 16 位可以拆为两个 8 位的 AH 与 AL 寄存器。

寻址寄存器(Index registers)

INDEXRegister32-bit (31-00)16-bit (15-00)08-bit (15-08)08-bit (07-00)Descripton
5Stack PointerESPSP SPL栈指针 寄存器
6Stack Base PointerEBPBP BPL基址指针 寄存器
7Source IndexESISI SIL源变址 寄存器
8Destination IndexEDIDI DIL目的变址 寄存器

段寄存器(Segment Registers)

名称英文中文
SSStack Segment栈段 寄存器
CSCode Segment代码段 寄存器
DSData Segment数据段 寄存器
ESExtra Segment附加段 寄存器
FSF Segment(无名称)
GSG Segment(无名称)

程序计数器(Program counter)

program counter

idx名称英文中文
1EIPInstruction Pointer程序计数器

在 32-bit Protected Mode 下,处理器使用 32-bit EIP 进行寻址。如果该处理器工作在 16-bit Mode 下,依旧使用 IP 进行寻址。

即使是在 在 32-bit Protected Mode 下,EIP Register 只能由处理器内部使用,程序无法直接访问。只能通过 JMP CALL RET IRET 等等指令隐式修改。

标志寄存器

在 16-bit Processor 中,标志寄存器(FLAGS Register)是 16 位的,在 32-bit Processor 中,扩展到 32 位。

名称简称=1=0描述
00Carry flagCFCY(Carry)NC(No Carry)在指令执行过程中,是否向 最高有效位的更高位 借位或进位。该标志位用于无符号数运算。
01     
02Parity flagPFPE(Parity Even)PO(Parity Odd)在指令执行结果中,壹的个数是否为偶数。
03     
04Adjust flagAFAC(Auxiliary Carry)NA(No Auxiliary Carry) 
05     
06Zero flagZFZR(Zero)NZ(Not Zero)指令执行结果是否为零。
07Sign flagSFNG(Negative)PL(Positive)指令执行结果是否为负数。
08Trap flagTF   
09Interrupt enable flagIFEI(Enable Interrupt)DI(Disable Interrupt)在指令执行过程中,是否处理可屏蔽中断。
10Direction flagDFDN(Down)UP(Up)控制字符串的处理方向
11Overflow flagOFOV(Overflow)NV(Not Overflow)在指令执行过程中,是否发生溢出。该标志位用于有符号数运算。
12     
13     
14     
15     
16     
17     
18     
19     
20     
21     
22     
23     
24     
25     
26     
27     
28     
29     
30     
31     

影响标志寄存器的指令:
1)标志寄存器相关:运算指令;
2)标志寄存器无关:传送指令;

CF vs. OF
=> 当我们将计算视为无符号计算时,只需关注 CF 标志位;
=> 当我们将计算视为有符号计算时,只需关注 OF 标志位;

正确的理解:当我们将计算视为无符号计算时,标志位 CF 是怎样的。当我们将计算视为有符号计算时,标志位 OF 是怎样的
错误的理解:对于某个计算,标志位 CF 是怎样的变化的,标志位 OF 是怎样的变化的

理解 “溢出” 含义
“溢出”并不是超出寄存器表示范围,而是从我们定义的某个范围达到我们定义的另个范围

64-bit(AMD Opteron, …)

通用寄存器(General-Purpose Registers)

general-purpose registers (GPRs)

INDEXRegister64-bit (63-00)32-bit (31-00)16-bit (15-00)08-bit (15-08)08-bit (07-00)Descripton
1AccumulatorRAXEAXAXAHAL累加 寄存器
2CounterRCXECXCXCHCL计数 寄存器
3DataRDXEDXDXDHDL数据 寄存器
4BaseRBXEBXBXBHBL基址 寄存器

寻址寄存器(Index registers)

INDEXRegister64-bit (63-00)32-bit (31-00)16-bit (15-00)08-bit (15-08)08-bit (07-00)Descripton
5Stack PointerRSPESPSP SPL栈指针 寄存器
6Stack Base PointerRBPEBPBP BPL基址指针 寄存器
7Source IndexRSIESISI SIL源变址 寄存器
8Destination IndexRDIEDIDI DIL目的变址 寄存器

在 64-bit CPU 中,这些寄存器 SP、BP、SI、DI 具有地位,但是只能在 64 bit 模式中使用:
assembly – Can the lower byte of the registers RSI, RDI, RSP and RBP be directly addressed in the 64-bit Intel processors? – Stack Overflow

段寄存器(Segment Registers)

名称英文中文
SSStack Segment栈段 寄存器
CSCode Segment代码段 寄存器
DSData Segment数据段 寄存器
ESExtra Segment附加段 寄存器
FSF Segment(无名称)
GSG Segment(无名称)

在 32-bit Protected Mode 下,从理论上讲,是不需要采用分段模型来访问内存,但是该处理器依旧需要分段访问内存。但是提供变通方案,即段以 0x00000000 基地址,段为 4GB 大小,即平坦模型(Flat Mode)。

在 32-bit Protected Mode 下,每个 Segment Register 由两部分组成:1)16-bit Segment Selector;2)64-bit Descriptor Cache;
1)64-bit Descriptor Cache 用于缓存 GDT 表项,每个 GDT 表项是 64 bits 的。

标志寄存器

名称简称=1=0描述
00Carry flagCFCY(Carry)NC(No Carry)在指令执行过程中,是否向 最高有效位的更高位 借位或进位。该标志位用于无符号数运算。
01     
02Parity flagPFPE(Parity Even)PO(Parity Odd)在指令执行结果中,壹的个数是否为偶数。
03     
04Adjust flagAFAC(Auxiliary Carry)NA(No Auxiliary Carry) 
05     
06Zero flagZFZR(Zero)NZ(Not Zero)指令执行结果是否为零。
07Sign flagSFNG(Negative)PL(Positive)指令执行结果是否为负数。
08Trap flagTF   
09Interrupt enable flagIFEI(Enable Interrupt)DI(Disable Interrupt)在指令执行过程中,是否处理可屏蔽中断。
10Direction flagDFDN(Down)UP(Up)控制字符串的处理方向
11Overflow flagOFOV(Overflow)NV(Not Overflow)在指令执行过程中,是否发生溢出。该标志位用于有符号数运算。
12     
13     
14     
15     

参考文献

参考《汇编语言(第三版)王爽 著》
Wikipedia/FLAGS register
Intel 8086 – Wikipedia
x86 – Wikipedia
X86 Assembly/X86 Architecture – Wikibooks, open books for an open world