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

  CREATED BY JENKINSBOT

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

16-bit(8086, 8088, … 80286)

通用寄存器(General-Purpose Registers)

general-purpose registers (GPRs)

idx Register 16-bit (15-00) 08-bit (15-08) 08-bit (07-00) Descripton
1 Accumulator AX AH AL 累加 寄存器
2 Counter CX CH CL 计数 寄存器
3 Data DX DH DL 数据 寄存器
4 Base BX BH BL 基址 寄存器

对于在表中的 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

idx Register 16-bit (15-00) 08-bit (15-08) 08-bit (07-00) Descripton
5 Stack Pointer SP   SPL 栈指针 寄存器
6 Stack Base Pointer BP   BPL 基址指针 寄存器
7 Source Index SI   SIL 源变址 寄存器
8 Destination Index DI   DIL 目的变址 寄存器

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

段寄存器(Segment Registers)

segment registers

idx 名称 英文 中文
1 SS Stack Segment 栈段 寄存器
2 CS Code Segment 代码段 寄存器
3 DS Data Segment 数据段 寄存器
4 ES Extra Segment 附加段 寄存器

程序计数器(Program counter)

program counter

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

标志寄存器(Status register)

Status register, FLAGS

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

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

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

32-bit(80386, …)

通用寄存器(General-Purpose Registers)

INDEX Register 32-bit (31-00) 16-bit (15-00) 08-bit (15-08) 08-bit (07-00) Descripton
1 Accumulator EAX AX AH AL 累加 寄存器
2 Counter ECX CX CH CL 计数 寄存器
3 Data EDX DX DH DL 数据 寄存器
4 Base EBX BX BH BL 基址 寄存器

对于 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)

INDEX Register 32-bit (31-00) 16-bit (15-00) 08-bit (15-08) 08-bit (07-00) Descripton
5 Stack Pointer ESP SP   SPL 栈指针 寄存器
6 Stack Base Pointer EBP BP   BPL 基址指针 寄存器
7 Source Index ESI SI   SIL 源变址 寄存器
8 Destination Index EDI DI   DIL 目的变址 寄存器

段寄存器(Segment Registers)

名称 英文 中文
SS Stack Segment 栈段 寄存器
CS Code Segment 代码段 寄存器
DS Data Segment 数据段 寄存器
ES Extra Segment 附加段 寄存器
FS F Segment (无名称)
GS G Segment (无名称)

程序计数器(Program counter)

program counter

idx 名称 英文 中文
1 EIP Instruction 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 描述
00 Carry flag CF CY(Carry) NC(No Carry) 在指令执行过程中,是否向 最高有效位的更高位 借位或进位。该标志位用于无符号数运算。
01          
02 Parity flag PF PE(Parity Even) PO(Parity Odd) 在指令执行结果中,壹的个数是否为偶数。
03          
04 Adjust flag AF AC(Auxiliary Carry) NA(No Auxiliary Carry)  
05          
06 Zero flag ZF ZR(Zero) NZ(Not Zero) 指令执行结果是否为零。
07 Sign flag SF NG(Negative) PL(Positive) 指令执行结果是否为负数。
08 Trap flag TF      
09 Interrupt enable flag IF EI(Enable Interrupt) DI(Disable Interrupt) 在指令执行过程中,是否处理可屏蔽中断。
10 Direction flag DF DN(Down) UP(Up) 控制字符串的处理方向
11 Overflow flag OF OV(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)

INDEX Register 64-bit (63-00) 32-bit (31-00) 16-bit (15-00) 08-bit (15-08) 08-bit (07-00) Descripton
1 Accumulator RAX EAX AX AH AL 累加 寄存器
2 Counter RCX ECX CX CH CL 计数 寄存器
3 Data RDX EDX DX DH DL 数据 寄存器
4 Base RBX EBX BX BH BL 基址 寄存器

寻址寄存器(Index registers)

INDEX Register 64-bit (63-00) 32-bit (31-00) 16-bit (15-00) 08-bit (15-08) 08-bit (07-00) Descripton
5 Stack Pointer RSP ESP SP   SPL 栈指针 寄存器
6 Stack Base Pointer RBP EBP BP   BPL 基址指针 寄存器
7 Source Index RSI ESI SI   SIL 源变址 寄存器
8 Destination Index RDI EDI DI   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)

名称 英文 中文
SS Stack Segment 栈段 寄存器
CS Code Segment 代码段 寄存器
DS Data Segment 数据段 寄存器
ES Extra Segment 附加段 寄存器
FS F Segment (无名称)
GS G 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 描述
00 Carry flag CF CY(Carry) NC(No Carry) 在指令执行过程中,是否向 最高有效位的更高位 借位或进位。该标志位用于无符号数运算。
01          
02 Parity flag PF PE(Parity Even) PO(Parity Odd) 在指令执行结果中,壹的个数是否为偶数。
03          
04 Adjust flag AF AC(Auxiliary Carry) NA(No Auxiliary Carry)  
05          
06 Zero flag ZF ZR(Zero) NZ(Not Zero) 指令执行结果是否为零。
07 Sign flag SF NG(Negative) PL(Positive) 指令执行结果是否为负数。
08 Trap flag TF      
09 Interrupt enable flag IF EI(Enable Interrupt) DI(Disable Interrupt) 在指令执行过程中,是否处理可屏蔽中断。
10 Direction flag DF DN(Down) UP(Up) 控制字符串的处理方向
11 Overflow flag OF OV(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