首页 /  技术专区  /  汇编语言 宽屏模式 >

标志寄存器

一.认识标志寄存器的特殊之处

image.png

标志寄存器的结构 

        flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。 

        8086CPU中没有使用flag的1、3、5、12、13、14、15位,这些位不具有任何含义。

标志寄存器的作用 

        用来存储相关指令的某些执行结果 

        用来为CPU执行相关指令提供行为依据     

        用来控制CPU的相关工作方式

观察寄存器的值

image.png

image.png

直接访问标志寄存器的方法 

        pushf :将标志寄存器的值压栈

        popf :从栈中弹出数据,送入标志寄存器中。

二.ZF-零标志(Zero Flag)

image.png

ZF标记相关指令的计算结果是否为0 

        ZF=1,表示“结果是0 ” ,1表示“逻辑真” 

        ZF=0,表示“结果不是0” ,0表示“逻辑假”

image.png

在8086CPU的指令集中,有的指令的执行是影响标志 寄存器的,比如:add、sub、mul、div、inc、or、 and等,它们大都是运算指令,进行逻辑或算术运算; 

有的指令的执行对标志寄存器没有影响,比如:mov、 push、pop等,它们大都是传送指令。 

使用一条指令的时候,要注意这条指令的全部功能, 其中包括执行结果对标记寄存器的哪些标志位造成 影响。

三.PF-奇偶标志(Parity Flag)

image.png

PF记录指令执行后,结果的所有二进制位中1的个数: 

        1的个数为偶数,PF = 1; 

        1的个数为奇数,PF = 0。

image.png

四.SF-符号标志(Sign Flag)

image.png

SF记录指令执行后,将结果视为有符号数 

        结果为负,SF = 1

        结果为非负,SF = 0

image.png

1000 0010B作为有符号数对应-111 1110B,即-126D 

1000 0010B作为无符号数对应+1000 0010B,即+130D


基础:有符号数与补码 

计算机中有符号数一律用补码来表示和存储。 

正整数的补码是其二进制表示,与原码相同 

        例:+9的补码是00001001 

负整数的补码,将其对应正数二进制的所有位取 反(包括符号位,0变1,1变0)后加1 

        例:-5的补码 . -5对应正数5(00000101)→所有位取反 (11111010)→加1(11111011) . 所以-5的补码是11111011。


SF 标志是CPU对有符号数运算结果的一种记录 。 

将数据当作有符号数来运算的时候,通过SF可知结果的正负;将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值

五.CF-进位标志(Carry Flag)

image.png

在进行无符号数运算的时候,CF记录了运算结果的最高有效位向更高位的进位值, 或从更高位的借位值。 

CF记录指令执行后, 

        有进位或借位,CF = 1 

        无进位或借位,CF = 0

image.png

对于位数为N的无符号数来说,其对应的二进制信 息的最高位即第N-1位,是最高有效位 

假想存在的第N位,就是相对最高有效位的更高位。

image.png

六.OF-溢出标志(Overflow Flag)

image.png

在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。 

OF记录有符号数操作指令执行后, 

        有溢出,OF = 1 

        无溢出,OF = 0

image.png

机器所能表达的范围 

        以8位运算为例,结果用 8 位寄存器或内存单 元来存放,机器所能表示的范围就是-128~127。 

        同理,对于16 位有符号数,机器所能表示的 范围是-32768~32767。 

注意,此处溢出只是对有符号数运算而言。

CF和OF的区别 

        CF是对无符号数运算有意义的进/借位标志位 

        OF是对有符号数运算有意义的溢出标志位

image.png

七.综合:一条指令会带来多个标志寄存器的变化

image.png


头像
0/200
图片验证码