• 标志寄存器和跳转指令


      cmp、test、add等指令可以改变标志寄存器的标志位,然后根据标志位完成跳转指令来实现循环、判断。
    一、标志寄存器
    1、ZF:零(Zero Flag),判断结果是否为0。运算结果0,ZF置1,否则置0。
    2、PF:奇偶(Parity Flag),反映运算结果低8位中'1'的个数。'1'的个数为偶数,PF置1,否则置0。
    3、SF:符号(Sign Flag),反映运算结果的符号。运算结果为负,SF置1,否则置0。
    4、CF:进位(Carry Flag),反映无符号运算是否产生进位或借位。运算结果的最高有效位向更高位进位或者借位,CF置1,否则置0。
    5、OF:溢出(Overflow Flag),反映有符号运算是否溢出。运算结果超过了8位或者16位有符号数的表示范围,OF置1,否则置0。
    6、AF:辅助(Auxiliary Flag),在字节操作时低半字节向高半字节进位或借位。字操作时低字节向高字节进位或借位,AF置1,否则置0。
    7、DF:方向(Direction Flag),决定串处理指令控制每次操作后si、di的增减。df=0,则每次操作后si、di递增,否则递减。
    8、IF:中断(Interrupt Flag),决定CPU是否响应外部可屏蔽中断请求。IF为1时,CPU允许响应外部的可屏蔽中断请求。
    9、TF:陷阱(Trap Flag),TF被设置位1时,CPU进入单步模式,所谓单步模式就是CPU在每执行一步指令后都产生一个单步中断。主要用于程序的调试。8086/8088中没有专门用来置位和清零TF的命令。
    二、test和cmp指令
      test和cmp都用在两个操作数的比较上,都不会改变目标操作数。区别主要是:test进行的是逻辑与运算,运算结果为0时,ZF=1;cmp进行的是算数减法运算,运算结果为0时,ZF=1。

      test常用在测试寄存器是否为0,寄存器某位或某几位是为0或1。

    test eax, eax
    jz short loc_401035 ;如果eax=0,则ZF=1,此时就会跳转。
    
    ;;;;;;;;;;;;;
    
    test ax, 0100000000000001b
    jnz short loc_401035 ;如果ax的第2和第16位同时为1,则ZF=0,此时跳转。用来检测寄存器的某位是否为1或0。


    影响标志位的指令
    修改标志位
    影响标志位的指令
    test指令
    cmp指令
    常用跳转指令
    jz和jnz
    jz和jnz
    jz和jnz
    jz和jnz
    jz和jnz

  • 相关阅读:
    ZJOI2019 Day1 游记
    Codeforces Round #545 (Div. 1)
    AtCoder WTF 2019 C2. Triangular Lamps Hard
    析合树
    Codeforces Round #539 (Div. 1)
    Codeforces 1103 E. Radix sum
    Codeforces 1097 G. Vladislav and a Great Legend
    sts创建spring项目
    servlet项目demo
    IDEA中创建maven web项目
  • 原文地址:https://www.cnblogs.com/cnstalker/p/6827034.html
Copyright © 2020-2023  润新知