首页 理论教育 转移指令的使用及编写分支程序的方法

转移指令的使用及编写分支程序的方法

时间:2023-02-28 理论教育 版权反馈
【摘要】:无条件转移指令JMP的操作数可以有多种形式,对其灵活运用,是设计好分支程序尤其是多分支程序的基础。下面通过例子来说明用JMP实现无条件转移的多种方法。本质上,有条件转移指令都是判断标志位的,即使用于无符号或带符号数比较后的有条件转移指令也是如此。然而,顺序执行的分支语句体1不会自动跳过分支语句体2,所以分支语句体1最后一定要有一条JMP指令跳过分支语句体2,即分支汇点处;否则将进入顺序分支语句体2而出现错误。

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的符号函数可表示为:

img75

程序可通过对符号标志的判别来确定执行哪一分支。其程序流程图如图4-5所示。

img76

图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所示。

img77

图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

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈