《汇编语言(第四版)》 . 王爽著 . 清华大学出版社 . 2019
¶实验 16 编写包含多个功能子程序的中断例程
¶一个示例程序 - 理解数据标号
将 code 段中的 a 标号处的 8 个数据累加,结果存储到 b 标号处的字中。
1 | cs:code |
在上面的程序中,code、a、b、start、s 都是地址标号,仅仅表示了内存单元的地址,而数据标号(后面不带 : 的)还能够描述单元长度,在指令中可以代表一个段中的内存单元
使用数据标号后,将程序修改如下:
1 | cs:code |
标号 a 描述了地址 code:0,和从这个地址开始,以后的内存单元都是字节单元,而标号 b 描述了地址 code:8,和从这个地址开始,以后的内存单元都是字单元
对于程序中的 “b dw 0”,下面一些指令等价:
1 | mov ax,b |
对于程序中的 “a db 1,2,3,4,5,6,7,8”,下面一些指令等价:
1 | mov al,a[si] |
¶检测点 16.1
将 code 段中 a 处的 8 个数据累加,结果存储到 b 处的双字中,补全程序。
1 | cs:code |
如果考虑进位
1 | cs:code |
¶在其他段中使用数据标号
一般不在代码段中定义数据,而将数据定义到其他段中,在其他段中我们也可以用数据标号来描述存储数据的单元的地址和长度,而地址标号只能在代码段中使用
下面的程序将 data 段中的 a 标号处的 8 个数据累加,结果存储到 b 标号处的字中
1 | cs:code,ds:data |
若想在代码段中直接使用数据标号访问数据,则需要用伪指令 assume 将标号所在的段和一个段寄存器联系起来,并且在程序中还要用指令对段寄存器进行设置
¶检测点 16.2
mov ax,data
mov es,ax
对比此程序与上一个程序
在用 assume 指令将段寄存器和某个段相联系后,在程序中还要使用指令对段寄存器进行设置
¶讨论用查表的方法编写相关程序
1 | ;用 al 传送要显示的数据 |
¶依据数据直接计算出所要找的元素的位置(直接定址表)
可以占用一些内存空间来换取运算的速度,将所要计算的 sin(x) 的结果都存储到一张表中,然后用角度值来查表,找到对应的 sin(x) 的值。
1 | ;用 ax 向子程序传递角度 |
利用表,在两个数据集合之间建立一种映射关系,使我们能用查表的方法根据给出的数据得到其在另一集合中对应数据,这样做的目的一般来说有以下三个
1)为了算法的清晰与简洁
2)为了加快运算速度
3)为了使程序易于扩充
像这种可以通过依据数据,直接计算出所要找的元素的位置的表,我们称其为直接定址表
¶程序入口地址的直接定址表
在直接定址表中存储子程序的地址可以方便地实现不同子程序的调用
1 | ;清屏 |
将这些功能子程序的入口地址存储在一个表中,它们在表中的位置和功能号相对应。
对应关系为:功能号*2=对应的功能子程序在地址表中的偏移
1 | setscreen: jmp short set |
用根据功能号查找地址表的方法,程序的结构清晰,便于扩充。如果加入一个新的功能子程序,那么只需要在地址表中加入它的入口地址就可以了。
¶实验任务
1 | cs:code |
测试程序
1 | cs:code |
¶汇编语言实验合集
实验 1 查看 CPU 和内存,用机器指令和汇编指令编程
实验 2 用机器指令和汇编指令编程
实验 3 编程、编译、连接、跟踪
实验 4 [bx] 和 loop 的使用
实验 5 编写、调试具有多个段的程序
实验 6 实践课程中的程序
实验 7 寻址方式在结构化数据访问中的应用
实验 8 分析一个奇怪的程序
实验 9 根据材料编程
实验 10 编写子程序
课程设计 1
实验 11 编写子程序
实验 12 编写 0 号中断的处理程序
实验 13 编写、应用中断例程
实验 14 访问 CMOS RAM
实验 15 安装新的 int9 中断例程
实验 16 编写包含多个功能子程序的中断例程
实验 17 编写包含多个功能子程序的中断例程
课程设计 2