文章目录
汇编 分支程序设计
一、与分支有关的指令
1.1 无条件转移指令
- 格式:
JMP label
- 功能:JMP 指令无条件跳转到目标地址,该地址用代码标号(label)来标识,并被汇编器转换为偏移量。
- 说明:当 CPU 执行一个无条件转移时,目标地址的偏移量被送入指令指针寄存器,从而导致迈从新地址开始继续执行。
1.2 条件转移指令
- 格式:
Jcc label
- 功能:指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令。
- 说明:
(1)操作数label是采用段内短转移;
(2)Jcc指令不影响标志,但要利用标志。 - Jcc指令的分类:根据利用的标志位不同,16条指令分成3种情况。
(1)判断单个标志位状态
(2)比较无符号数高低
(3)比较有符号数大小
1.2.1 判断单个标志位状态
这组指令单独判断5个状态标志之一:
-
JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)。 JZ/JE表示结果为零(或相等),则转移。
-
JS和JNS:利用符号标志SF,判断结果是正是负, JS表示结果为负则转移。
-
JO和JNO:利用溢出标志OF,判断结果是否产生溢出, JO表示溢出则转移。
-
JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇。JP表示偶个数个1。
-
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种关系:
- 高于(不低于等于):JA 和JNBE
- 高于等于(不低于):JAE 和JNB
- 低于(不高于等于):JB和JNAE
- 低于等于(不高于):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种关系:
- 大于(不小于等于):JG和JNLE
- 大于等于(不小于):JGE和JNL
- 小于(不大于等于):JL和JNGE
- 小于等于(不大于):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 单重分支
- 条件成立跳转到标号所在的指令执行,否则顺序执行分支语句体。
- 注意:选择正确的条件转移指令和转移目标地址。
- 举例:编程求|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个分支体后。
- 举例:编写计算下面函数值的程序:设输入数据为X、输出数据Y,且皆为字节变量。
{ Y = 1 , X > = 0 ; Y = − 1 , X < 0 ; \begin{cases} Y=1,X>=0;\\ Y=-1,X<0; \end{cases} {Y=1,X>=0;Y=−1,X<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