1 通用寄存器
这些的寄存器是程序执行代码最最常用,也最最基础的寄存器,程序执行过程中,绝大部分时间都是在操作这些寄存器来实现指令功能。
所谓通用,即这些寄存器CPU没有特殊的用途,交给应用程序“随意”使用。注意,对于有些寄存器,CPU有一些潜规则,用的时候要注意。
eax
:通常用来执行加法,函数调用的返回值一般也放在这里面ecx
:通常用来作为计数器,比如for循环edx
:读写I/O端口时,edx用来存放端口号esp
:栈顶指针,指向栈的顶部ebp
:栈底指针,指向栈的底部,通常用ebp+偏移量的形式来定位函数存放在栈中的局部变量esi
:字符串操作时,用于存放数据源的地址edi
:字符串操作时,用于存放目的地址的,和esi两个经常搭配一起使用,执行字符串的复制等操作eip
:指向CPU当前指向的指令ebx
: 数据存取
2 标志寄存器
CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能)具有以下3中作用。
- 用来存储相关指令的某些执行结果。
- 用来为CPU执行相关指令提供行为依据。
- 用来控制CPU的相关工作方式。
8086CPU的flag寄存器的结构如图下所示
D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OF | DF | IF | TF | SF | ZF | AF | PF | CF |
空出来的说明在8086CPU中没有使用,布局有任何含义。
它反映了CPU运算的状态特征并且存放某些控制标志
2.1 CF 进位标志位
定义:当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0。
实例:
1. 修改 eax:FFFFFFFF
2. 写指令
add eax,0x1
3.结果:
eax:00000000
C: 1
A:1
2.2 ZF 零标志位
定义:若当前的运算结果为零,则ZF为1,否则为0。
- flag的第6位是ZF,0标志位。
记录相关指令执行后,其结果是否为0,
if = 0; zf = 1
if != 0; zf = 0
eg.mov ax,1 sub ax,1 执行后,结果为0,则zf=1
mov ax,1 add ax,0 执行后,结果为0,则zf=1,表示“结果是0”
mov ax,1 or ax,0 执行后,结果不为0,则zf=0,表示“结果非0”
2.3 SF 符号标志位
定义:该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0。
2.4 OF 溢出标志位
若运算结果超出机器能搞表示的范围称为溢出,此时OF为1,否则为0。
2.5 PF 奇偶标志位
定义:当运算结果的最低16位中含1的个数位偶数,则PF为1,否则为0。
- flag的第2位是PF,奇偶标志位。
记录相关指令执行后,其结果的所有bit位中
1
的个数
是否为偶数
,
if 偶数 则 pf = 1
if 奇数 则 pf = 0
eg.mov al,1 add al,10 执行后,结果为00001011B,其中3(奇数)个1,则 pf = 0;
mov al,1 or al,2 执行后,结果为00000011B,其中有2(偶数)个1,则 pf = 1;
sub al,al 执行后,结果为00000000B,其中有0(偶数)个1,则 pf = 1;
2.6 AF 辅助进位标志
定义:一个加法(减法)运算结果的低4位想高4位有进位(或借位)时,则AF=1,反之AF=0。
2.7 TF 跟踪标志
定义:该标志位为方便程序调试而设置。若TF=1,8086/8088 CPU处于单步工作方式,即在每条指令执行结束后,产生中断。
2.8 DF 方向标志
定义:该标志位用来控制处理指令的处理方向,若DF=1,则串处理过程中地址自动递减,否则自动递增。
2.8 IF 中断标志
等等