顺序程序设计

在设计上比较简单,按指令书写的先后顺序执行一系列操作,程序流程中无分支、无循环、这种程序也被称为直线结构。

分支程序设计

程序能够对自身执行情况进行自动判断,根据判断的结果控制程序选择不同的程序段执行的程序结构称为分支程序。

在 80x86 系列微机中,转移指令是一组可以在程序执行过程中,根据不同情况进行程序转移的控制类指令,是实现分支程序设计的基础。

转移指令

转移指令的功能是使程序无条件的转移到指定的目标地址处,无条件转移指令执行后,程序将从目标地址处的指令开始继续执行。

1.无条件转移指令

无条件转移指令的功能是使程序无条件的转移到指定的目标地址处。

1.)段内直接转移

格式:JMP [SHORT|NEAR PTR] 标号

说明:

该标号与当前无条件转移指令处于同一个代码段中,格式中的 SHORT 运算符表明指令代码中的操作数是 8 为偏移量,用补码表示,取值范围为 -128+127 ,目标地址与当前无条件转移指令的距离在 -128+127 字节范围内,叫做短转移。

NEAR PTR 运算符表明指令代码中的操作数是 16 为偏移量,用补码表示,取值范围为 -32768+32767,目标地址与当前无条件转移指令的距离在 -32768+32767 字节范围内,叫做近转移。

SHORT 和 NEAR PTR 可省略不写,由程序在汇编时自行计算偏移量。

功能:转移到标号指定的代码段执行。

具体操作:将 IP 的内容修改为标号的偏移地址, CS 的内容不变。

2.)段间间接转移

格式:JMP 存储单元地址

说明:该存储单元与当前无条件转移指令处于同一个代码段。

功能:转移到指定的存储单元地址所在处的代码执行。

具体操作:将 IP 的内容修改为存储单元的偏移地址, CS 的内容不变。

3.)段间直接转移

格式:JMP FAR PTR 标号

说明:该标号与当前无条件转移指令处于不同的代码段。

功能:转移到标号指定的代码处执行。

具体操作:将 IP 的内容修改为标号的偏移地址,将 CS 的内容修改为标号所在段的段地址。

4.)段间间接转移

格式:JMP DWORD PTR 存储单元地址

功能:转移到指定的存储单元地址所在行的代码处执行。

具体操作:将 IP 的内容修改为存储单元地址的偏移地址,将 CS 的内容修改为存储单元地址所在段地址。

条件转移指令

条件转移指令以某些标志位或标志位的逻辑运算位依据,满足条件,程序转移至指定目标地址,不满足条件,程序顺序执行。需要注意的是,条件转移的目标地址在 -128~+127 字节范围内。

一般格式:JXX 目标地址

其中 xx 由 1-3 个字母组成,表示转移条件。

1.)检测单个标志位实现转移的条件转移指令。

指令名称 测试条件 说明
JC CF=1 有进位/有借位转移
JNC CF=0 无进位/无借位转移
JO OF=1 有溢出转移
JNO OF=0 无溢出转移
JP/JPE PF=1 有偶数个1转移
JNP/JPO PF=0 有奇数个1转移
JS SF=1 负数转移
JNS SF=0 正数转移
JZ/JE ZF=1 结果为0/相等转移
JNZ/JNE ZF=0 结果不为0/相等转移

2.)根据两个无符号数的比较结果实现转移的条件转移指令

指令名称 测试条件 说明
JA/JNBE CF= 0 ZF=0 大于/不小于等于转移
JAE/JNB CF=0 OR ZF=1 不小于/大于等于转移
IB/JNAE CF=1 AND ZF=0 小于/不大于等于转移
JBE/JNA CF=1 OR ZF=1 不大于/小于等于转移

3.)根据两个有符号数的比较结果实现转移的条件转移指令

指令名称 测试条件 说明
JG/JNLE SF=OF AND ZF=0 大于/不小于等于转移
JGE/JNL SF=OF OR ZF=1 不小于/大于等于转移
JL/JNGE SF≠OF AND ZF=0 小于/不大于等于转移
JLE/JNG SF≠OF OR ZF=1 不大于/小于等于转移
多分支结构程序设计

常用的方法有条件转移法、地址表法、转移表法。

条件转移法:

使用一个条件转移指令可以实现一个双分支,使用多个条件转移指令可以实现多分支。条件转移法就是使用多个转移指令来实现多分支结构。

地址表法:

在数据段中利用 DW 指令将 n 个分支的入口处的偏移地址安装顺序放在一段连续的存储区中,构成地址表。

设地址表的首地址为 BASE,则第 i 个分支的入口处偏移地址为:表地址=i2+BASE,当程序需要转向第 i 个分支时,只需将 2\i 送入 BX,并执行 JMP BASE[BX] , 即可。

转移表法:

与地址表法类似,只是需要在代码段中把转移到 n 个分支程序段的转移指令,JMP SHORT BRi(i=1,2,3……) 以此存放在一起,形成转移表,调用方式与地址表类似。