汇编之分支程序设计

汇编之分支程序设计

1. 条件转移指令

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 相同)

2. 分支程序设计

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

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 双分支

  • 条件成立跳转执行第2个分支语句体,否则顺序执行第1个分支语句体。
  • 注意第1个分支体后一定要有一个JMP指令跳到第2个分支体后。
    在这里插入图片描述
  • 举例:编写计算下面函数值的程序:
    Y=1,X>=0;
    Y=-1,X<0;
    设输入数据为X、输出数据Y,且皆为字节变量。
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章