认识标志寄存器的特殊之处
-
标志寄存器的结构
- flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
- 8086CPU中没有使用flag的1、3、5、12、13、14、15位,这些位不具有任何含义。
-
标志寄存器的作用
- 用来存储相关指令的某些执行结果
- 用来为CPU执行相关指令提供行为依据
- 用来控制CPU的相关工作方式
-
直接访问标志寄存器的方法
- pushf:将标志寄存器的值压栈;
- popf :从栈中弹出数据,送入标志寄存器中。
ZF—零标志
-
ZF标记相关指令的计算结果是否为0
- ZF=1,表示“结果是0,1表示“逻辑真”
- ZF=0,表示“结果不是0”,0表示“逻辑假”
-
在8086CPu的指令集中,有的指令的执行是影响标志寄存器的,比如: add,sub,mul,div,inc、or,and等,它们大都是运算指令,进行逻辑或算术运算
-
有的指令的执行对标志寄存器没有影响,比如:mov.push、pop等,它们大都是传送指令。
-
使用一条指令的时候,要注意这条指令的全部功能,其中包括执行结果对标记寄存器的哪些标志位造成影响。
PF—奇偶标志
- PF记录指令执行后,结果的所有二进制位中1的个数:
- 1的个数为偶数,PF= 1;
- 1的个数为奇数,PF = 0。
SF—符号标志
-
SF记录指令执行后,将结果视为有符号数
- 结果为负,SF= 1;
- 结果为非负,SF=0。
-
基础:有符号数与补码
- 计算机中有符号数一律用补码来表示和存储。正整数的补码是其二进制表示,与原码相同
- 例:9的补码是00001001
- 负整数的补码,将其对应正数二进制l的所有位取反(包括符号位,0变1,1变0)后加1
- 例:-5的补码
- -5对应正数5 (o0000101)→所有位取反
- (11111010 )→加1(11111011)
- 所以-5的补码是11111011。
- 计算机中有符号数一律用补码来表示和存储。正整数的补码是其二进制表示,与原码相同
-
SF标志是CPU对有符号数运算结果的一种记录。
-
将数据当作有符已数来运算的时候,通过SF可知结果的正负;将数据当作无符号数来运算人SF的值则没有意义,虽然相关的指令影响了它的值。
CF—进位标志
- 在进行无符号数运算的时候,CF记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
- CF记录指令执行后,
- 有进位或借位,CE=1
- 无进位或借位,CF =0
OF—溢出标志
-
在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出
-
OF记录有符号数操作指令执行后,
- 有溢出,OF= 1
- 无溢出,OF = 0
-
机器所能表达的范围
- 以8位运算为例,结果用8位寄存器或内存单元来存放,机器所能表示的范围就是-128~127
- 同理,对于16位有符号数,机器所能表示的范围是-32768~32767。
- 注意,此处溢出只是对有符号数运算而言。
-
CF和OF的区别
- CF是对无符号数运算有意义的进/借拉标志位
768~32767。 - 注意,此处溢出只是对有符号数运算而言。
- CF是对无符号数运算有意义的进/借拉标志位