标志寄存器
段寄存器,通用寄存器,隐藏寄存器.
这节课再学一个寄存器,叫做标志寄存器。
旗帜标志寄存器(EFLAGS):
主要用于反映处理器的状态和运算结果的某些特征及控制指令的执行。
这话太专业了,我们用大白话给大家举个例子。
在CPU里面,有一些指令运行完之后,会把一些运行完的情况放到标志寄存器里面。
另外一些指令会根据标志寄存器的一些情况决定如何运行。
大家都知道快过年了,小偷们喜欢偷东西要过年。
为了能够提高团队作案的效率,两个小偷组团。
第一个小偷负责踩点。
第二个小偷负责偷东西。
第一个小偷出去踩点,如果发现这户出去几天没回家了,会在墙上刻一个0,发现有人刻一个非常1.
踩点回来之后。
第二个小偷出去偷东西,看到是1的,就绕过去。
看到是0的就进去偷进去。
CF | 进位标志位(CarryFlag) | 反映无符号运算是否产生进位或借位。运算结果的最高有效位向更高位进位或者借位,CF置1,否则置0。 |
PF | 奇偶标志位(Parity Flag) | 运算结果低8位中'1'的个数。'1'的个数为偶数,PF置1,否则置0。 |
AF | 辅助进位标志位(Auxiliary Flag) | 在字操作时,发生低字节向高字节进位或借位时;在字节操作时,发生低4位向高4位进位或借位时。 |
ZF | 零标志位(Zero Flag) | 判断结果是否为0。运算结果0,ZF置1,否则置0。 |
SF | 符号标志位(Sign Flag) | 反映运算结果的符号。运算结果为负,SF置1,否则置0。 |
TF | 陷阱(单步)标志位(Trap Flag) | TF被设置位1时,CPU进入单步模式,所谓单步模式就是CPU在每执行一步指令后都产生一个单步中断。主要用于程序的调试。8086/8088中没有专门用来置位和清零TF的命令。 |
IF | 中断标志位(Interrupt Flag) | 决定CPU是否响应外部可屏蔽中断请求。IF为1时,CPU允许响应外部的可屏蔽中断请求。 |
DF | 方向标志位(Direction Flag) | 决定串处理指令控制每次操作后si、di的增减。df=0,则每次操作后si、di递增,否则递减。 |
OF | 溢出标志位(Overflow Flag) | 反映有符号运算是否溢出。运算结果超过了8位或者16位有符号数的表示范围,OF置1,否则置0。 |
DF影响的指令
MOVS,CMPS,SCAS,LODS,STOS
STD和CLD的指令用于设置以及清楚DF标志
CF=(Carry Flag)
mov al,0xFf //进位
add
al,0x1
mov al,0x1
sub al,0x2 //借位
ZF=(Zero Flag)
mov ax,0x1
sub ax,0x1
cmp
ax,bx
(cmp指令相当于sub指令,但是相减的结果并不保存到第一个操作数中)
compare(比较)
SF
OF
判断某个值是否为0
test
EAX,EAX
(test 指令相当于 AND指令,但是与的结果并不保存到第一个操作数中)
当CPU执行完一些指令之后,会影响标志寄存器的变化。