• 8089汇编 标志寄存器


    8089汇编 标志寄存器

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

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

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

    标志寄存器的结构

      flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
      8086CPU中没有使用flag的1、3、5、12、13、14、15位,这些位不具有任何含义。

    标志寄存器的作用

      用来存储相关指令的某些执行结果
      用来为CPU执行相关指令提供行为依据
      用来控制CPU的相关工作方式

    观察值

    标志位说明

    一、标志位解析

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

    • pushf :将标志寄存器的值压栈;
    • popf :从栈中弹出数据,送入标志寄存器中。

    2、内存中16位标志位表示

     3、标志位说明

    二、ZF-零标志(Zero Flag)

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

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

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

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

    • 1的个数为偶数,PF = 1;
    • 1的个数为奇数,PF = 0。

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

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

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

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

    • 结果为负,SF = 1;
    • 结果为非负,SF = 0。

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

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

    CF记录指令执行后:

    • 有进位或借位,CF = 1
    • 无进位或借位,CF = 0

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

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

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

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

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

    • 有溢出,OF = 1
    • 无溢出,OF = 0

    机器所能表达的范围

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

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

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

    CF和OF的区别

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

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

    应用

     七、DF-方向标志位(Direction Flag)

    在串处理指令中,控制每次操作后si,di的增减:

    • DF = 0:每次操作后si,di递增;
    • DF = 1:每次操作后si,di递减。

    对DF位进行设置的指令:

    • cld指令:将标志寄存器的DF位设为0(clear)
    • std指令:将标志寄存器的DF位设为1(setup)

     八、其他标志说明

    TF-陷阱标志(Trap flag):用于调试时的单步方式操作。当TF=1时,每条指令执行完后产生陷阱,由系统控制计算机;当TF=0时,CPU正常工作,不产生陷阱。

    IF-中断标志(Interrupt flag):当IF=1时,允许CPU响应可屏蔽中断请求;当IF=0时,关闭中断。

    CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断(中断类型码为1),引发中断过程,执行中断处理程序。

  • 相关阅读:
    SQLite的使用
    Messenger类的使用
    Binder的使用(跨进程——AIDL,非跨进程)
    Android Studio中如何创建AIDL
    第二章——Parcelable接口的使用(跨进程,Intent传输)
    InetAddress的作用
    第二章——Serializable的使用(跨进程使用和Intent的传递对象)
    SurfaceView绘图机制
    双缓冲机制简介
    内部类代码
  • 原文地址:https://www.cnblogs.com/xiangsikai/p/12484988.html
Copyright © 2020-2023  润新知