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