实验三 分支程序设计
一. 实验目的:
掌握分支程序设计和调试方法
二. 实验要求:
分支程序的基本设计方法包括:
1 掌握利用条件转移指令方法
2 了解利用跳转表方法
3 了解利用逻辑尺方法
三. 实验仪器:
PC 机一台
四. 实验内容:
3.1 将一个字节的十六进制数转换成对应的 ASCII 码。
例: 3EH→33H('3'),4EH('E')
3.2 编写可接受 10 个键盘命令 ( A,B...J ),完成分别转向P1,P2,….P10 的程序。P1,P2,...P10 程序用 P1,P2,...P10 显示表示。
3.3 将 10 个十六位带符号数中正数相加。
例:3543H,5943H,-3578H,-3432H,4523H,3323H,-5634H,54EFH,-5423H,7230H
3.4 利用逻辑尺方法完成 16 个无符号数 ( WORD )中第 1,3,6,8,10,
11,14 个数的相加。
例:0FE4H,4320H,9564H,4575H,0E47AH,8643H,5686H,4542H
3B4CH,3223H,7856H,5435H,5432H,0A586H,5456H,6673H
则 2C0CCH
3.5 编写在一串数据中统计正数,负数和零的个数并加以显示。
例: 34H,-3BH,-5AH,72H,0,-2DH,0,66H
则正数:3,负数:3,零:2
3.6 统计某十六位数中 "1" 的个数并加以显示。
例: 0101001100101110B 则 8
3.7 一种数值滤波的方法是将相邻的两数求平均值,试编程序实现。
3.8 将字符串1 插入字符串2 的中间, 其位置由键盘输入。
3.9 在一已排序的数组中插入新的数据,插入新数据后的数组仍满足排序
要求。
3.10 编写一串在带符号数中找出最大数和最小数的程序。
例: 35H,32H,73H,10H,08H,0FH,2AH,3BH 则:最大数73H
最小数08H
3.11 在一组数据中根据最高两位( D7D6 ) 分别将对应的数据位相加,
结果加以显示。
例 D7D6 D5D4D3D2D1D0
信息位 数 据 位
3.12 统计一组数据 ( BYTE ) 中 D3D2D1 位相同的个数并加以显示。
3.13 编写一程序完成无符号数的排序程序(由大到小)。
例: 34H,67H,0E2H,0A7H,89H,73H,51H,43H
0E2H,0A7H,89H,73H,67H,51H,43H,34H
3.14 自编题
五. 实验原理:
分支结构是程序设计的基本结构,它们在执行过程中,或直接更改或通过对标志的判别,实现更改程序按顺序执行的次序,这些更改是通过对 IP (段内)或 CS:IP
(段间)的修改完成的,而实现对这些寄存器的修改是通过无条件转移和有条件转移完成的。
1 无条件转移
无条件转移采用的是无条件转移指令,即 JMP 类指令,在 8086 汇编中,JMP 类指令根据需要转移的目的不同,分成短 JMP ( SHORT ), 段内 JMP (
NEAR )和段间 JMP ( FAR ),其基本格式如下:
短 跳 转: JMP TTT ; TTT 在该跳转指令的 ±127 字节之内
段内跳转: JMP TTT ; TTT 是段内 NEAR 型定义的标号
JMP
NEAR PTR TTT
JMP
CX ; 利用寄存器中内容替换 IP
JMP
WORD PTR [BX] ; 利用内存中某字单元内容替换 IP
段间跳转: JMP FAR PTR TTT ; TTT 是 FAR 型标号
JMP
DWORD PTR [BX] ; 利用内存中双字单元内容替换 IP和 CS
严格地说, SHORT 跳转不是当前 JMP 指令的 ±127 字节之内,计算机实际操作过程是将该指令读入后的 IP ,即 JMP 当前地址加
2 后的 IP与指令中八位的偏移量相加,然后替换 IP,所以,若以 JMP 指令的位置为准的话,则是 -126 至+129 之间。 SHORT 和
NEAR 型一般由汇编时自动区分,应指出的是,条件转移采用的都是 SHORT 型,因此,当源和目的较远时
( 即超出 SHORT 范围 ),应在较近的位置设置一条 JMP 指令,以实现不同位置的跳转。
2 条件转移
条件判别指令是条件转移程序设计的基础,掌握指令如何对标志的影响及如何利用条件转移指令达到程序分支的目的。
如前所述,条件转移的跳转距离都是 SHORT 型。对跳转的条件判别根据判别的条件分两类,一种是单条件的判别,另一种是复合条件的判别,对单条件判别,主要对单一的标志位进行测试,如判 CF 标志,判 SF
标志等,而复合条件则是对多标志位进行判别,其标志的影响一般是由数值运算后决定的,如带符号数大于等于的条件判别等。尽管复合条件需多标志判别,但在8086指令助记符中与单条件转移指令没有区别。
单条件判别指令如下:
1 JC
或 JNC 根据进位标志 CF 进行转移
2 JE/JZ
或 JNE/JNZ 根据零标志 ZF 进行转移
3 JS
或 JNS 根据符号标志 SF 进行转移
4 JO
或 JNO 根据溢出标志 OF 进行转移
5 JP/JPE
或 JNP/JPO 根据奇偶标志 PF 进行转移
根据操作数的不同,分无符号数和带符号数的判别,对无符号数有 A( 高于 ) B( 低于),带符号数有
G( 大于 ) L( 小于 ) 等判别。为了方便起见,其指令助记符对同一种条件可能有多种表示方法,如,JGE 与 JNL 的条件判别条件是相同的,使用者根据习惯和需要选取其中的一种表示。
无符号数判别指令如下:
1 JA/JNBE
高于(不低于等于)转移
2 JAE/JNB
高于等于(不低于)转移
3 JB/JNAE
低于(不高于等于)转移
4 JBE/JNA
低于等于(不高于)转移
带符号数判别指令如下:
1 JG/JNLE
大于(不小于等于)转移
2 JGE/JNL
大于等于(不小于)转移
3 JL/JNGE
小于(不大于等于)转移
4 JLE/JNG
小于等于(不大于)转移
3 分支程序设计
有条件转移程序是分支程序主要部分,这样的分支程序是根据当前运算的结果去判断选择不同的程序段执行,反之,如果要求是根据不同的情况,完成不同的任务,则需要使用分支程序结构来实现。如上述,程序的分支是根据标志决定的,所以,如何影响标志及如何利用标志是分支程序的重点,例如,判断 AX 中内容是否是负数,我们可用多种方法实现:
方法一 AND AX, AX ; 影响 SF 标志
JS MINCE
; 为负数转入负数处理
.........
方法二 CMP AX, 0 ; 影响 SF 标志
JS MINCE
; 为负数转入负数处理
.........
方法三 TEST AX,8000H ; 影响 ZF 标志
JNZ
MINCE ; 为负数转入负数处理
.........
方法四 ADD AX,AX ; 影响 CF 标志
JC MINCE
; 为负数转入负数处理
.........
方法五 SHL AX,1 ; 影响 CF 标志
JC MINCE
; 为负数转入负数处理
.........
还可以举出其它方法
由上例可以看出,同样的目的可用不同的方法去影响不同的标志,采用不同的跳转指令来实现,显然,要编好分支程序,首先应掌握指令对标志如何影响,这也是汇编程序设计的特点之一。
本实验中有输入和显示。以下列出简单的字符输入和显示的程序,注意,它们都是以 ASCII 码方式体现的。
1. 由键盘读入字符的程序:
MOV
AH,01 ; 功能号
INT
21H ; 系统调用读入字符
MOV
INPUT_CHAR, AL ; AL 为输入的字符的 ASCII 码值
2. 由屏幕显示字符的程序:
MOV
AH,02H ; 功能号
MOV
DL,'#' ; DL : 显示字符的 ASCII 码
INT
21H ; 系统调用显示字符