P289 数据标号标记了存储数据的单元的地址和长度。它不同于仅仅表示地址的地址标号。
P290 注意:在后面加有":"的地址标号,只能在代码段中使用,不能在其它段中使用。
P295 在上面的两个子程序中,我们将 通过给出的数据进行计算或比较而得到结果的问题,转化为用给出的数据作为查表的数据,通过查表得到问题的结果。具体的查表方法,是用查表的依据数据,直接计算出所要查找的元素在表中的位置。像这种可以通过依据数据,直接计算出所要找的元素的位置的表,我们称其为:直接定址表。
P299 实验16 编写包含多个功能子程序的中断例程
安装一个新的 int 7ch 中断例程,为显示输出提供如下功能子程序:
(1) 清屏;
(2) 设置前景色;
(3) 设置背景色;
(4) 向上滚动一行。
入口参数说明如下:
(1) 用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行;
(2) 对于2、3号功能,用al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}。
编写代码如下:
程序最后有如下代码:
如果想试一试清屏功能,那么就去掉 mov ah,0 前面的注释,把 mov ah,3 加上注释。另外两个功能类推。
简单分析一下程序:大家应该注意到,从start标号 开始的主程序放在后面,而中断例程(这个中断例程里面还包含了四个子程序)放在了前面。为什么要这样做,把start开始的主程序放在前面行不行?答案是:不行。因为我们程序的功能是把中断例程放到从 0000:0200h 开始的内存单元处,而我们运行程序时要拷贝的这段代码的起始地址为 cs:0000。我们知道,8086CPU编程时有分段的思想。举个例子,我们要使用清屏的功能,sub1就代表了本段中sub1处代码的偏移地址,在本程序中为0x23,这样在中断例程的最开始地方使用 dw 伪指令保存的值就是0x0023。把这段中断例程拷贝到 0000:0200h处之后,sub1的偏移地址就不是0x23了,此时它的段偏移变为0x0223,所以要从偏移地址为0x0223的内存单元取出原来的偏移地址0x23,然后再加上0x200。然后调用 call 指令调用相应的子程序。
那如果我说,我就是不喜欢把中断例程放在前面,我就要把start主程序放在前面,该怎么办呢?编程能否实现?答案是:能。