第16章 直接定址表 笔记

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主程序放在前面,该怎么办呢?编程能否实现?答案是:能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值