王爽《汇编语言》(第二版) 学习笔记 (第十六章 直接定址表)

时间:2021-04-22 01:13:20

第十六章 直接定址表

一、             描述了单元长度的标号

1.         我们一直在代码段中使用标号来标记指令、数据、段的起始地址。

2.         程序中codeabstarts等标号仅仅表示了内存单元的地址。

3.         我们可以使用一种标号,这种标号不但表示内存单元的地址,还表示了内存单元的长度,即表示在此标号处的单元,是一个字节单元,还是字单元,还是双字单元。如

a:db 1,2,3,4,5,6,7,8             改写为    a   db   1,2,3,4,5,6,7,8

b:dw  0                       改变为    b     dw   0

使用不带“:”的标号,它们是同时描述内存地址和单元长度的标号。这种标号包含了对单元长度的描述,所以,在指令中,它可以代表一个段中的内存单元。

4.         使用这种包含单元长度的标号,可以使我们以简洁的形式访问内存中的数据。以后,我们将这种标号称为数据标号,它标记了存储数据的单元的地址和长度。它不同于仅仅表示地址的地址标号。

二、             在其他段中使用数据标号

1.         一般来说,我们不在代码段中定义数据,而是将数据定义到其他段中。在其他段中,我们也可以使用数据标号来描述存储数据的单元的地址和长度。

2.         注意,在后面加有“:”的地址标号,只能在代码段中使用,不能再其他段中使用。

3.         注意,如果想在代码段中直接用数据标号访问数据,则需要用伪指令assume将标号所在的段和一个段寄存器联系起来。否则编译器在编译的时候,无法确定标号的段地址在哪一个寄存器中。当然,这种联系是编译器需要的,但绝对不是说,我们因为编译器的工作需要,用assume指令将段寄存器和某个段相联系,段寄存器中就会真的存放该段的地址。我们在程序中还要使用指令对段寄存器进行设置。

4.         可以将标号当做数据来定义,此时,编译器将标号所表示的地址当做数据的值。

5.         seg操作符,功能为取得某一标号的段地址。

三、             直接定址表

1.         在建立数据映射关系时,有时在数值计算方面找不到一致性的规律或者规律过于繁琐,可以使用在内存中构建表,以查表的方式来建立这种映射。

2.         以查表的方式来建立映射,这样做的目的一般来说有以下3个:

1)        为了算法的清晰和简洁

2)        为了加快运算速度

3)        为了使程序易于扩充

3.         编程的时候要注意程序的容错性,即对于错误的输入要有处理能力。

4.         我们将通过给出的数据进行计算或比较而得到结果的问题,转化为用给出的数据作为查表的依据,通过查表得到结果的问题。具体的查表方法,是用查表的依据数据,直接计算出所要查找的元素在表中的位置。像这种可以通过依据数据,直接计算出所要找的元素的位置的表,我们称其为:直接定址表。

四、             程序入口地址的直接定址表

1.         我们可以在直接定址表中存储子程序的地址,从而方便地实现不同子程序的调用。

2.         用根据功能号查找地址表的方法,程序的结构清晰,便于扩充。如果加入一个新的功能子程序,那么只需要在地址表中加入它的入口地址就可以。

五、             实验16编写包含多个功能子程序的中断例程