寄存器
包含在处理器内部的内存储单元,称为寄存器。
1、 优点:处理器可以通过寄存器来访问数据,从而可以不用通过访问内存。
2、 缺点:寄存器的数目是有限的。
IA-32系列中一般有如下寄存器:
寄存器 | 描述 |
通用 | 8个32位寄存器,用于存储正在处理的数据 |
段 | 6个16位寄存器,用于处理内存访问 |
指令指针 | 1个32位寄存器,指向要执行的下一条指令 |
浮点 | 8个80位寄存器,用于浮点计算 |
控制 | 5个32位寄存器,用于控制处理器操作模式 |
调试 | 8个32位寄存器,用于在调试处理时的信息 |
标志 | 1个32位寄存器,确定操作状态 |
通用寄存器
8个32位寄存器分别有以下用途
寄存器 | 描述 |
EAX | 主要用于操作数据及结果的累加器 |
EBX | 指向数据内存段中的数据的指针 |
ECX | 字符串和循环操作的计数器 |
EDX | I/O指针 |
EDI | 字符串操作目的地指针(destination) |
ESI | 字符串操作源指针(Source) |
ESP | 栈顶指针 |
EBP | 栈底指针 |
段寄存器
6个16位段寄存器描述如下:
寄存器 | 描述 |
CS | 代码段 |
DS | 数据段 |
SS | 堆栈段 |
ES | 附加段指针 |
FS | 附加段指针 |
GS | 附加段指针 |
1、 寻址有三种:平坦内存模式,实地址模式,分段寻址模式。这三种的主要区别如下表:
寻址 | 描述 |
平坦内存模式 | 直接访问内存,段寄存器什么的,不用 |
实地址模式 | 16位寄存器,16位的段寄存器,要访问20位的内存。只好把段寄存器左移4位再加上偏移值。 |
分段 | 把内存分成好几个段,每个段的信息放在固定的某个数组中。而段寄存器值只是这个数组的一个索引。 |
关于这一点,书上并没有讲得很清楚。我还以为实地址与平坦模式是一样的。实际上不一样。
2、 DS,ES,FS,GS都是用于数据段寻址,这样就可以使用4个独立的数据段。从而程序可以隔离数据元素,让其有不同的属性。比如C语言里面的变量与常量。
控制寄存器
5个32位控制器描述如下:
寄存器 | 描述 |
CR0 | 控制操作模式,处理器状态 |
CR1 | 当前不用 |
CR2 | 内存页面错误信息 |
CR3 | 内存页面目录信息 |
CR4 | 支持处理器的特性和说明处理器的特性能力 |
1、 不能直接访问控制寄存器的值。需要通过通用寄存器来查询或更改其值。
标志寄存器
标志寄存器分为三种:
1、 状态标志
2、 控制标志
3、 系统标志
状态标志
标志 | 位 | 作用 |
CF | 0 | 进位标志 |
PF | 2 | 奇偶标志 |
AF | 4 | 辅助进位标志 |
ZF | 6 | 零标志 |
SF | 7 | 符号标志 |
OF | 11 | 溢出标志 |
1、 无符号操作数最高位发生进位或借位,CF置1,表明溢出
2、 PF为1表示偶数
3、 AF是只是进位或借位则置1
4、 SF是结果最高位,表示结果为正或负
5、 OF,当符号数运算正值过大,或负值过小,置1
控制标志
就一个DF,DF=1表示递减方式处理内存字符串。DF=0表示按递增方式处理字符串
系统标志
标志 | 位 | 说明 |
TF | 8 | 陷阱标志, 设置为1时启用单步模式, 在单步模式下处理器每次只执行一条命令。 |
IF | 9 | 中断使能标志, 控制处理器如响应从外部源接收到的信号。 |
IOPL | 12,13 | IO特权级别标志, 表明当前正在运行任务的IO特权级别, 它定义IO地址空间的特权访问级别, 该值必须小于或者等于访问I/O地址空间的级别; 否则任何访问IO空间的请求都会被拒绝! |
NT | 14 | 嵌套任务标志控制当前运行的任务是否连接到前一个任务, 它用于连接被中断和被调用的任务。 |
RF | 16 | 恢复标志用于控制在调试模式中如何响应异常。 |
VM | 17 | 虚拟8086模式, 表明处理器在虚拟8086模式中而不是保护模式或者实模式。 |
AC | 18 | 对准检查标志, 用于启用内存引用的对准检查 |
VIF | 19 | 虚拟中断标志, 当处理器在虚拟模式中操作时, 该标志起IF标志的作用。 |
VIP | 20 | 虚拟中断挂起标志, 在虚拟模式操作时用于表示一个中断正在被挂起。 |
ID | 21 | 表示CPU是否支持cpuid指令, 如果处理器能够设置或者清零这个标志, 表示处理器支持该指令。 |
上面图片中PF应该是奇偶位