实验二、循环与子程序程序设计
一、实验目的:
- 加深对循环结构的理解。
- 掌握循环程序的设计方法。
- 学习子程序的定义和调用方法。
- 掌握子程序、子程序的嵌套、递归子程序的结构。
- 掌握子程序设计、编制及调试。
- 熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。
二、实验内容:
- 编制程序计算S=1+2·3+3·4+4·5+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。
▶
Code
1 |
|
- 将从3000H内存单元开始的100个字节存储单元全部清0。
▶
Code
1 |
|
- 编制在屏幕上显示九九乘法表的程序。
▶
Code
1 |
|
- 编制在屏幕上显示用*组成的三角形的程序。
▶
Code
1 |
|
- 设有五个字数据存放在以BUF为首地址的内存单元中,要求采用调用多个字数据相加的子程序方法编程,和的低位字放在RESULT单元,和的高位字放在RESULT+2单元,并将结果显示在屏幕上。
▶
Code
1 |
|
- 编写一个递归子程序,计算指数函数Xn的值,其中X,n从键盘输入。
▶
Code
1 |
|
三、实验设备
PC机一台
四、实验步骤
- 按程序流程图编制实验程序。
- 输入源程序。
- 汇编、连接程序,执行程序,检查结果。
- 对内存单元3000H开始的100个存储单元用E命令输入任意数。
- 程序的执行可用DEBUG的G命令,也可用T命令单步跟踪执行。
- 用D命令检查执行结果。
五、实验展示
这里展示代码和运行结果,为了方便阅读,将代码块放到了实验内容中。
六、实验总结
- 主要使用指令
指令 | 指令功能 |
---|---|
mov reg, data | reg = data |
add reg, data | reg = reg+data |
sub reg, data | reg = reg-data |
mul reg | ax = ax*reg |
div reg | 当reg为8位 ah = ax/reg, al = ax%reg 当reg为16位 ax = ax/reg, dx = ax%reg |
cmp a, b | a == b zf = 1 a != b zf = 0 a < b cf = 1 a >=b cf = 0 a > b cf = 0, zf = 0 a <= b cf = 1, zf = 1 |
jb tag | 当cf = 1, 跳转到 tag |
je tag | 当 zf = 1, 跳转到 tag |
jmp tag | 无条件跳转到 tag |
- 标志位寄存器
寄存器 | 功能 |
---|---|
sf | 符号标志位,运算结果为负时为1 |
cf | 进位标志位(无符号数)当向最高位进位或借位时为1 |
of | 溢出标志位(有符号数)当有符号数运算发生溢出时为1 |
-
汇编循环程序的实现
循环程序由初始化部分、循环部分、调整部分、控制部分组成,有两种方式,一种是先判断在执行,另一种是先执行再判断。两种控制循环的方式:- 计数控制循环:一般使用LOOP指令,要先将循环的次数放入CX中,在多重循环的计数控制中要注保存和复原上一次循环的断点信息,在保留和复原时可以使用堆栈进行处理。自认为可以理解为一根盘绕了确定的圈数的绳子,又进入的头,又出去的尾。
- 条件控制循环:一般使用JMP指令使程序跳到这一段的开头,用CMP在循环中进行比较判断,再根据程序要求,选择适当的转移条件,跳出循环。自认为可以理解为一圆形的导轨,并在导轨上设置一个初口,在符合条件时就在导轨上脱离,否则,将会在导轨上一直的转下去。
再循环中可以同时使用两者,当即己知循环的次数限制范围,但又要求在符合条件时结束循环时,就要同时使用两者。
附录
-
文件列表
- 8086-8088 汇编语言指令表.pdf
-
下载地址
- 蓝奏云链接:https://wwrl.lanzn.com/iHYAc2srr42b
- 蓝奏云提取密码:31va
实验二、循环与子程序程序设计
https://flowerdown.org/posts/20221219-161614.html