汇编指令_条件转移

汇编指令_条件跳转

前言:由于这些条件跳转在自己的学习中经常能够遇到,所以想稍微整理一下。本人新手,技术较菜,如有写的不对的地方,还请指出,会及时更正。

以下基于8086CPU

  • 标志寄存器(flag寄存器)
    简单介绍下标志寄存器里各个位的用处。
    flag
    CF标志位/Carry Flag
    flag的第0位,进位标志位。在进行无符号运算时,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。当有进位或借位产生时CF=1,反之CF=0。
    (注:进位与借位都是相对二进制而言)

PF标志位/Parity Flag
flag的第2位,奇偶标志位。它记录了相关指令执行后,其结果的所有bit位中 1 的个数是否为偶数。若为偶数、则PF=1,为奇数、PF=0。

AF标志位/Auxiliary Carry Flag
flag的第四位,辅助进位标志。用以表示加减法做到一半时有没有形成进位/借位,如果有则AF=1。

ZF标志位/Zero Flag
flag的第6位,零标志位。记录了相关指令执行后,其结果是否为0,若结果为0,则ZF=1;结果不为0,ZF=0

SF标志位/Sign Flag
flag的第7位,符号标志位。记录了相关指令执行后,其结果是否为负。若结果为负,则SF=1;结果为非负,SF=0。

TF标志位/Trace Flag
flag的第8位,定时器溢出标志。类似于单步调试程序,在执行一条指令后,CPU查看TF标志位,若TF=1,则产生单步中断;TF=0,程序则继续向下执行。

IF标志位/Interrupt Flag
flag的第9位,中断允许标志位。若IF=1,cpu在执行完当前指令后响应中断,引发中断过程;若IF=0,则不响应可屏蔽中断。

DF标志位/Direction Flag
flag的第10位,方向标志位。在串处理指令中,控制每次操作后si,di的增减。若DF=0,则每次操作后si、di递增;DF=1,每此操作后si,di递减。

OF标志位/Overflow Flag
flag的第11位,溢出标志位。一般情况下,OF记录了有符号数运算的结果是否发生了溢出。若发生溢出,OF=1;没发生溢出,OF=0

  • cmp 、 test 指令简介
    cmp : 比较指令, cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。cmp可以同时进行两种比较,无符号数比较和有符号数比较,所以根据cmp指令的比较结果进行转移的指令也分为两种。
    1、根据无符号数的比较结果进行转移的条件转移指令(检测ZF、CF的值)
    2、根据有符号数的比较结果进行转移的条件转移指令(检测SF、OF和ZF的值)

    test : 将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。但是,Test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。
    影响标志位:CF,OF,PF,ZF,SF(其中CF与OF两个标志会被设为0)
    注:还有一些其他指令也会对标志位进行影响

  • 条件转移指令的格式和条件
    简单的条件转移指令

汇编格式 条件说明
JC OPR CF=1,有进位/有借位转移
JNC OPR CF=1,无进位/无借位转移
JS OPR SF=1,是负数转移
JNS OPR SF=0,是正数转移
JO OPR OF=1,有溢出转移
JNO OPR OF=0,无溢出转移
JZ/JE OPR ZF=1,相等/为0转移
JNZ/JNE OPR ZF=0,不相等/不为0转移
JP/JPE OPR PF=1,有偶数个1转移
JNP/JPO OPR PF=0,有奇数个1转移

无符号数条件转移指令

汇编格式 条件说明
JA/JNBE OPR CF=0且ZF=0,高于/不低于或等于转移
JAE/JNB OPR CF=0或ZF=1,高于等于/不低于转移
JB/JNAE OPR CF=1且ZF=0,低于/不高于或等于转移
JBE/JNA OPR CF=1或ZF=0,低于等于/不高于转移

带符号数条件转移指令

汇编格式 条件说明
JG/JNLE OPR SF=OF且ZF=0,大于/不小于或等于转移
JGE/JNL OPR SF=OF或ZF=1,大于或等于/不小于转移
JL/JNGE OPR SF不等于OF且ZF=0,小于/不大于或等于转移
JLE/JNG OPR SF不等于OF或ZF=1,小于或等于/不大于转移

参考:https://blog.csdn.net/weixin_42617472/article/details/82187750

你可能感兴趣的:(汇编)