• 汇编第六日


    flag寄存器:

    ZF=1表示计算结果为0,反之

    PF = 0表示计算结果二进制表示中1的个数为奇数,反之

    SF = 0表示计算结果为正,反之

    CF为1,在加法中表明结果出现仅为,在减法中表明结果出现借位,反之

    OF = 1表示计算结果溢出,反之

    对于无符号数,CPU用CF位记录计算结果是否产生进位

    对于有符号数,CPU用OF位记录计算结果是否产生溢出

    两者计算结果都用SF位记录符号

    adc指令:带进位加法指令

    例如:

    sbb指令:带借位指令

    sbb ah 0:(ah) = (ah) - 0 - (cf)

    cmp ax, bx指令

    实际上执行了(ax)-(bx),但是结果并不保存在ax中仅仅改变标志寄存器中相应的位

    若 ax=bx 那么ZF = 1;反之

    但是对于cmp ax, bx后发现SF = 1,即结果符号为负,能否说明(ax) < (bx)?

    否,例如对于有符号数,ah = 22H(补码表示34),bh = 0A0H(补码表示-96)

    (ah) - (bh) = 34 - (-96) = 130 = 82H,82H是-126的补码,所以SF = 1,但是ah明显大于bh

    要考虑OF和SF得两者大小:

    1.对于无符号数cmp,要检查ZF,CF位

    2.对于有符号数cmp,要检查SF,OF,ZF位

    对于标识寄存器中位的jmp指令,该指令可以配合cmp(无符号数)使用,cmp比较之前两对象大小会修改flag寄存器中对应位,之后使用对应的jmp指令实现跳转

    je(e:equal,表明上面cmp两对象相等):ZF = 1转移,反之

    jne(ne:not equal,表明上面cmp两对象不相等,下同):ZF = 0转移,反之

    jb:CF  = 1转移,反之

    jnb:CF  = 0转移,反之

    ja:CF  = 1,ZF = 0转移,反之

    jna:CF  = 1或ZF = 1转移,反之

    DF标志位

    DF = 0 si和di寄存器内容会递增1

    DF = 1 si和di寄存器内容会递减1

    例如:

    movsb指令:以字节单位传递数据

    实现:((es)*16+(di)) = ((ds)*16+(si))

    之后如果DF = 0,di和si内容加1(1个内存单元);反之

    movsw指令:以单位传递数据

    实现:((es)*16+(di)) = ((ds)*16+(si))

    之后如果DF = 0,di和si内容加2(2个内存单元);反之

    rep movsb指令:

    根据cx寄存器中字数,反复执行“movsb” (cx)次,实现(cx)个字节传递

    cld指令:将DF置为0(clear)

    std指令:将DF置为1(set)

    pushf指令:将标志寄存器内容压栈

    popf指令:将栈顶内容弹出标识寄存器

    中断处理程序一直存在内存中,以防止CP随时调用

    iret指令:将返回到中断前进程执行(将CS:IP出栈,flag出栈)

    mov ax, 8 - 4 = mov ax, 4

    设置TF = 1将产生单步中断,CPU将当前进程执行一条指令,之后去执行单步中断的中断处理程序(例如debug)

     

    Done!!!

  • 相关阅读:
    Java里的阻塞队列
    ReentrantReadWriteLock读写锁实现分析
    策略模式
    Java线程池技术以及实现
    分布式锁的思路以及实现分析
    Protobuf入门实例
    配置maven环境变量并安装jar包到本地仓库
    nio简单客户端服务端实例
    Java内存模型(JMM)中的happens-before
    Java中锁的内存语义
  • 原文地址:https://www.cnblogs.com/chaunceyctx/p/7291840.html
Copyright © 2020-2023  润新知