汇编语言程序设计(十六)直接定址表
数据标号
- 使用标号可以标记指令、数据和段的起始地址,比如下边例子中的a和b,用offset a即可求出标号a所代表的偏移地址。
![]()
- 上边的code、a、b、start、s都是标号,但是只是表示了内存单元的首地址,但是不知道这个内存单元有多大,还有一种标号可以既表示内存单元的地址,也表示内存单元的大小。如下图中所示标号a和b,其实就是把两个冒号给去掉了,这样就能知道标号a出的内存单元大小是一个字节,而标号b处的内存单元的大小是一个字。
![]()
- 可以利用这种带大小的标号来方便地处理数据,比如mov ax, b即是mov ax, cs:[8],因为标号b表示的地址就是cs:[8],而其代表的内存单元的大小是一个字,因此可以直接传送到ax中去,ax大小也是一个字。如下边例子,标号b代表了一个内存单元,地址为code:8,长度为两个字节。但是,mov al,b会引起编译错误,因为b代表的内存单元是字单元,而al是8位的寄存器,只能存下一个字节。
![]()
- 此外,也可以将标号a和b当作段地址来使用,加上相应的偏移地址可以很方便得读写特定位置的一个字节或一个字的数据。格式为 mov al a[偏移量]。使用这种包含单元长度的标号,可以使我们以简洁的形式访问内存中的数据,这种标号称为数据标号。它标记了存储数据的单元的地址和长度。
![]()
在其它段中使用数据标号
- 以上内容中是在代码段中使用的数据标号,但是更一般的情况,我们应该在数据段中使用才对。
- 后边带冒号":"的地址标号只能在代码段中使用,不能在其它段中使用,因为这个东西一般是用于指令跳转的。
![]()
直接定址表
例子
-
编写子程序,以十六进制的形式在屏幕中间显示给定的byte型数据。
-
因为一个字节有8位,而一个十六进制的字符用4位表示,因为可以用两个十六进制的字符来表示一个字节。因此子程序要在屏幕上显示两个ascii字符。因此,把一个字节型数据分为高4位和低4位,然后分别用一个十六进制数对应的ascii符号来表示即可。
![]()
![]()
-
显然,我们希望能够在数值015之间和字符“0F”之间建立一种映射关系。
-
因为字符对应的asxii码也是一种整数,可以和数值进行加减,比如数值加上30H就等于对应字符的ascii值。
![]()
![]()
-
但是对于上边这种映射关系,09和1015的数字与字符的映射关系是不同的,即有两个不同的映射关系,而我们希望可以用同一种映射来得到字符。
-
可以采用的一种方法是,建立一张表,表中一次存储字符“0”“F”,将数值015当成这张表的偏移,那么就可以用一个映射来找到字符了。这是一种数据库的雏形概念,数据库即由一张张按类别分开的表组成。
-
利用表可以在两个数据集合之间建立一种映射关系,使得可以用查表得方法根据给出得数据得到其在另一集合中的对应数据。
![]()
-
上述解决问题的思路是:用一张表来实现两个集合之间的映射关系,通过依据数据,直接计算出在另一个集合中的对应数据的位置(当然上边例子中没有计算,直接就是当成索引用了),这样的表,我们称为直接定址表。
-
可以在直接定址表中存储子程序的地址,从而方便实现不同子程序的调用。










浙公网安备 33010602011771号