这些的寄存器是程序执行代码最最常用,也最最基础的寄存器,程序执行过程中,绝大部分时间都是在操作这些寄存器来实现指令功能。
所谓通用,即这些寄存器CPU没有特殊的用途,交给应用程序“随意”使用。注意,对于有些寄存器,CPU有一些潜规则,用的时候要注意。
eax
:通常用来执行加法,函数调用的返回值一般也放在这里面
ecx
:通常用来作为计数器,比如for循环
edx
:读写I/O端口时,edx用来存放端口号
esp
:栈顶指针,指向栈的顶部
ebp
:栈底指针,指向栈的底部,通常用ebp+偏移量的形式来定位函数存放在栈中的局部变量
esi
:字符串操作时,用于存放数据源的地址
edi
:字符串操作时,用于存放目的地址的,和esi两个经常搭配一起使用,执行字符串的复制等操作
eip
:指向CPU当前指向的指令
ebx
: 数据存取
CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能)具有以下3中作用。
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运算的状态特征并且存放某些控制标志 |
定义:当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0。
实例:
1. 修改 eax:FFFFFFFF
2. 写指令
add eax,0x1
3.结果:
eax:00000000
C: 1
A:1
定义:若当前的运算结果为零,则ZF为1,否则为0。
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”
定义:该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0。
若运算结果超出机器能搞表示的范围称为溢出,此时OF为1,否则为0。
定义:当运算结果的最低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;
定义:一个加法(减法)运算结果的低4位想高4位有进位(或借位)时,则AF=1,反之AF=0。
定义:该标志位为方便程序调试而设置。若TF=1,8086/8088 CPU处于单步工作方式,即在每条指令执行结束后,产生中断。
定义:该标志位用来控制处理指令的处理方向,若DF=1,则串处理过程中地址自动递减,否则自动递增。
等等