汇编 分支程序设计

文章目录

  • 汇编 分支程序设计
    • 一、与分支有关的指令
      • 1.1 无条件转移指令
      • 1.2 条件转移指令
        • 1.2.1 判断单个标志位状态
        • 1.2.2 比较无符号数高低
        • 1.2.3 比较有符号数大小
    • 二、分支的概念
      • 1.1 单重分支
      • 2.2 双分支

汇编 分支程序设计

一、与分支有关的指令

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=1 JNO 无溢出跳转 OF=0
JNZ 非零跳转 ZF=0 JS 有符号跳转 SF=1
JC 进位跳转 CF=1 JNS 无符号跳转 SF=0
JNC 无进位跳转 CF=0 JP 偶校验跳转 PF=1
JO 溢出跳转 OF=1 JNP 奇校验跳转 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张图片
  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个分支体后。
汇编 分支程序设计_第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
    

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