汇编语言程序设计 实验报告-2
1. 实验目的
- 加深对循环结构的理解
- 掌握循环程序的设计方法
- 学习子程序的定义和调用方法
- 掌握子程序、子程序的嵌套、递归子程序的结构
- 掌握子程序设计、编制及调试
- 熟练掌握 DEBUG 的常用命令,学会用 DEBUG 调试程序
2. 实验内容
2.1 任务一
编制程序计算 S=1+2·3+3·4+4·5+……+N(N+1) 直到 N(N+1) 大于 200 为止,并将结果由屏幕上显示出来。
▶
Code
1 | |
2.2 任务二
将从 3000H 内存单元开始的 100 个字节存储单元全部清 0。
▶
Code
1 | |
2.3 任务三
编制在屏幕上显示九九乘法表的程序。
▶
Code
1 | |
2.4 任务四
编制在屏幕上显示用 * 组成的三角形的程序。
▶
Code
1 | |
2.5 任务五
设有五个字数据存放在以 BUF 为首地址的内存单元中,要求采用调用多个字数据相加的子程序方法编程。和的低位字放在 RESULT 单元,和的高位字放在 RESULT+2 单元,并将结果显示在屏幕上。
▶
Code
1 | |
2.6 任务六
编写一个递归子程序,计算指数函数 Xn 的值,其中 X、n 从键盘输入。
▶
Code
1 | |
3. 调试步骤
- 按程序流程图编制实验程序
- 输入源程序
- 汇编、连接程序、执行程序、检查结果
- 对内存单元 3000H 开始的 100 个存储单元用 E 命令输入任意数
- 程序的执行可 DEBUG 的 G 命令,也可用 T 命令单步跟踪执行
- 用 D 命令检查执行结果
4. 分析与思考
- 常用指令
| 指令 | 指令功能 |
|---|---|
| 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://unrealfeathers.lanzouu.com/iHYAc2srr42b
- 蓝奏云提取密码:31va
汇编语言程序设计 实验报告-2
https://flowerdown.org/posts/20221219-161614