4.3.2 转移指令的使用及编写分支程序的方法
1.用无条件转移指令实现单分支程序
对于单分支程序,需要正确选择分支条件。因为条件指令使条件成立发生转移,所以分支语句体是在条件不成立时顺序执行,这一点与高级语言的分支IF语句不同,请特别注意。
无条件转移指令JMP的操作数可以有多种形式,对其灵活运用,是设计好分支程序尤其是多分支程序的基础。下面通过例子来说明用JMP实现无条件转移的多种方法。计算AX中有符号数的绝对值是一个典型的单分支结构,程序段如下:
CMP AX,0
JG E LP;分支条件:AX≥0
NEG AX;条件不满足、为负数,需要执行分支;体进行求补
LP:MOV RESULT,AX;条件满足、为正数,保存结果到RE;SULT中否则求绝对值的例子成为:
CMP AX,0
JLLP;分支条件:AX<0
JMP LP1;条件不满足、为正数,不需要求补,;转向保存结果
LP:NEG AX;条件满足、为负数,需要求补
LP1:MOV RESULT,AX;保存结果
比较上述两个程序段,由于后者选择分支条件不当,不仅多了一个JMP指令,而且也容易出错,因为对于后一程序段,这个JMP指令是不可缺少的。
【例4-3】 用JMP实现无条件转移的多种方法。
DATA SEGMENT
NI DW LP4
FI DD LP5
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
JMP NEARPTRLP1 ;使用标号,近转移,它表示LP1段;程序在本段内
LP1:…
JMP FARPTRLP2;使用标号,远转移
LP2:…
LEA DX,LP3JMP DX;以通用寄存器表示目标的偏移地址
LP3: …
JMP NI;以变量来表示目标的偏移地址
LP4: …
JMP FI;以变量表示目标的偏移地址和段地址
LP5: …
MOV AH,4CH;返回DOSINT 21H
CODE ENDS
END START
这五种方法都可以实现无条件转移,即实现程序的分支。
2.用有条件转移语句实现双分支程序
双分支结构相当于高级语言的IF-THEN-ELSE形式,通常使用有条件转移指令与无条件转移指令JMP来实现分支。一般必须先安排比较或算术、逻辑运算等影响标志位的指令,然后用有条件转移指令判断条件,以实现分支转移。本质上,有条件转移指令都是判断标志位的,即使用于无符号或带符号数比较后的有条件转移指令也是如此。
对于双分支程序,两种情况都有各自的分支语句体,选择条件并不关键。然而,顺序执行的分支语句体1不会自动跳过分支语句体2,所以分支语句体1最后一定要有一条JMP指令跳过分支语句体2,即分支汇点处;否则将进入顺序分支语句体2而出现错误。
【例4-4】 显示BX最高位的程序段
SHLBX,1;BX最高位移入CF标志
JC ONE;CF=1,即最高位为1,则转移
MOV DL,′0′;CF=0,即最高位为0,则′0′→DL
JMP TWO;一定要跳过另一个分支语句体
ONE:MOV DL,′1′;′1′→DL
TWO:MOV AH,2
INT 21H;显示
该程序是一个双分支结构,如果条件转移指令选择JNC,则只要交换两个分支语句体的位置即可。该程序也可以修改成为单分支程序结构。
MOV DL,′0′
SHLBX,1;BX最高位移入CF标志
JNC TWO;CF=0,即最高位为0,则转移
MOV DL,′1′;CF=1,即最高位为1,则′1′→DL
TWO:MOV AH,2
INT 21H;显示
【例4-5】 试编写程序实现符号函数。
分析 变量X的符号函数可表示为:
程序可通过对符号标志的判别来确定执行哪一分支。其程序流程图如图4-5所示。
图4-5 例4-5程序流程图
DATA SEGMENT
BUF DB X
Y DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AX,BUF ;(BUF)=X
CMP AX,0
JE ZERO;X=0,则转ZERO
JG PLUS;X为正数,则转PLUS
MOV BX,0FFFFH;X为负数,则FFFFH(-1的补码)送BXJMP EXIT;退出程序
ZERO:MOV BX,0
JMP EXIT;退出程序
PLUS:MOV BX,1
EXIT:MOV Y,BX
MOV AH,4CH;返回DOS
INT 21H
CODE ENDSEND START
【例4-6】 设有3个单字节无符号数存放在BUF开始的缓冲区中,编写一个能将它们按从大到小次序重新排列的程序。
分析 有多种方法可实现3个数的排序,我们采用交换法,先得到3个数中的最大数,然后再得到剩下两个数的最大数。为了方便,先将3个数取到3个寄存器中。其程序流程图如图4-6所示。
图4-6 例4-6程序流程图
DATA SEGMENT
BUF DB 43,87,12
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET BUF
MOV AL,[BX];把3个数送到寄存器中
MOV BL,[BX+1]
MOV CL,[BX+2]
CMP AL,BL;AL与BL比较
JAE LP1;大于不交换
XCHG AL,BL;小于交换
LP1:CMP AL,CL;AL与CL比较
JAE LP2;大于不交换
XCHG AL,CL;小于交换
LP2:CMP BL,CL;BL与CL比较
JAE LP3;大于不交换
XCHG BL,CL;小于交换
LP3:MOV[BX],AL;按从大到小依次存回缓冲区
MOV[BX+1],BL
MOV[BX+2],CL
MOV AH,4CH;返回DOS
INT 21H
CODE ENDS
END START
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。