汇编 分支程序设计

汇编 分支程序设计

一、与分支有关的指令

1.1 无条件转移指令

  1. 格式:JMP label
  2. 功能:JMP 指令无条件跳转到目标地址,该地址用代码标号(label)来标识,并被汇编器转换为偏移量。
  3. 说明:当 CPU 执行一个无条件转移时,目标地址的偏移量被送入指令指针寄存器,从而导致迈从新地址开始继续执行。

1.2 条件转移指令

  1. 格式:Jcc label
  2. 功能:指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令。
  3. 说明:
    (1)操作数label是采用段内短转移;
    (2)Jcc指令不影响标志,但要利用标志。
  4. Jcc指令的分类:根据利用的标志位不同,16条指令分成3种情况。
    (1)判断单个标志位状态
    (2)比较无符号数高低
    (3)比较有符号数大小
1.2.1 判断单个标志位状态

这组指令单独判断5个状态标志之一:

  1. JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)。 JZ/JE表示结果为零(或相等),则转移。

  2. JS和JNS:利用符号标志SF,判断结果是正是负, JS表示结果为负则转移。

  3. JO和JNO:利用溢出标志OF,判断结果是否产生溢出, JO表示溢出则转移。

  4. JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇。JP表示偶个数个1。

  5. JC和JNC:利用进位标志CF,判断结果是否进位或借位。进位或借位为1则转移。

助记符说明标志位/寄存器助记符说明标志位/寄存器
JZ为零跳转ZF=1JNO无溢出跳转OF=0
JNZ非零跳转ZF=0JS有符号跳转SF=1
JC进位跳转CF=1JNS无符号跳转SF=0
JNC无进位跳转CF=0JP偶校验跳转PF=1
JO溢出跳转OF=1JNP奇校验跳转PF=0
1.2.2 比较无符号数高低

无符号数高低有4种关系:

  1. 高于(不低于等于):JA 和JNBE
  2. 高于等于(不低于):JAE 和JNB
  3. 低于(不高于等于):JB和JNAE
  4. 低于等于(不高于):JBE和JNA
助记符说明助记符说明
JA大于跳转(若 leftOp > rightOp)JB小于跳转(若 leftOp < rightOp)
JNBE不小于或等于跳转(与 JA 相同)JNAE不大于或等于跳转(与 JB 相同)
JAE大于或等于跳转(若 leftOp ≥ rightOp)JBE小于或等于跳转(若 leftOp ≤ rightOp)
JNB不小于跳转(与 JAE 相同)JNA不大于跳转(与 JBE 相同)
1.2.3 比较有符号数大小

两数的大小分成4种关系:

  1. 大于(不小于等于):JG和JNLE
  2. 大于等于(不小于):JGE和JNL
  3. 小于(不大于等于):JL和JNGE
  4. 小于等于(不大于):JLE和JNG
助记符说明助记符说明
JG大于跳转(若 leftOp > rightOp)JL小于跳转(若 leftOp < rightOp)
JNLE不小于或等于跳转(与 JG 相同)JNGE不大于或等于跳转(与 JL 相同)
JGE大于或等于跳转(若 leftOp ≥ rightOp)JLE小于或等于跳转(若 leftOp ≤ rightOp)
JNL不小于跳转(与 JGE 相同)JNG不大于跳转(与 JLE 相同)

二、分支的概念

  • 分支程序根据条件是真或假决定执行与否,判断的条件是各种指令,如CMP、TEST等执行后形成的状态标志与条件转移指令Jcc联合可以实现分支控制。

1.1 单重分支

  1. 条件成立跳转到标号所在的指令执行,否则顺序执行分支语句体。
  2. 注意:选择正确的条件转移指令和转移目标地址。
  1. 举例:编程求|X-Y|,结果存于RESULT单元中,设X和Y都为16位数。
    DATA SEGMENT
      X DW -10
      Y DW 20
      RESULT DW?
    DATA ENDS
    STACK SEGMENT STACK	
      DB 100 DUP(?)
    STACK ENDS
    CODE SEGMENT
      ASSUME CS:CODE,DS:DATA,SS:STACK
    START:
      MOV AX,DATA
      MOV DS,AX
      MOV AX,X
      SUB AX,Y
      JNS NONNEG
      NEG AX
    NONNEG:
      MOV RESULT,AX
      MOV AH,4CH
      INT 21H
    CODE ENDS
      END START
    

2.2 双分支

  1. 条件成立跳转执行第2个分支语句体,否则顺序执行第1个分支语句体。
  2. 注意第1个分支体后一定要有一个JMP指令跳到第2个分支体后。
  1. 举例:编写计算下面函数值的程序:设输入数据为X、输出数据Y,且皆为字节变量。
    { Y = 1 , X > = 0 ; Y = − 1 , X < 0 ; \begin{cases} Y=1,X>=0;\\ Y=-1,X<0; \end{cases} {Y=1X>=0Y=1X<0
    DATA SEGMENT
      X DB -10
      Y DB ?
    DATA ENDS
    STACK SEGMENT STACK
      DB 200 DUP(0)
    STACK ENDS
    CODE SEGMENT
      ASSUME DS:DATA,SS:STACK,CS:CODE
    START:
      MOV AX,DATA
      MOV DS,AX
      CMP X,0
      JGE A
      MOV Y,-1
      JMP EXIT
    A:	MOV Y,1
    EXIT:MOV AH,4CH
      INT	 21H
    CODE ENDS
      END START
    
  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值