汇编-16.0-直接定址表
code、a、b、start、s都是标号,这些标号仅仅表示了内存单元的地址。
1.描述了单元长度的标号
a db 1,2,3,4,5,6,7,8 b dw 0
在code段中使用的标号a、b后面没有“:”,它们都是同时描述内存地址和单元长度的标号。标号a,表述了地址code:0,
和从这个地址开始,以后的内存单元都是字节单元。标号b描述了地址code:8,和从这个地址开始,以后的内存单元都是字单元。
因为这种标号描述了对单元长度的描述,所以在指令中,它可以代表一个段中的内存单元。对于 “b dw 0”:
指令:mov ax,b
相当于:mov ax,cs:[8]
指令:mov b,2
相当于:mov word ptr cs:[8],2
在这些指令中,标号代表了一个内存单元,地址为code:8,长度为两个字节。
可见,使用这种包含单元长度的标号,可以使我们以简洁的形式访问内存中的数据。这种标号称为数据标号。
它标记了存储数据单元的地址和长度。
2.在其他段中使用数据标号
一般不在代码段中定义数据,而是将其定义到其他段中。在其他段中,可以使用数据标号来描述存储的单元的地址和长度。
注意:在后面加有“:”的地址标号,只能在代码段中使用,不在其他段中使用。
assume cs:code,ds:data
注意,如果想在代码段中直接使用数据标号访问数据,则需要用伪指令assume将标号所在的段和一个段寄存器联系起来。
否则编译器在编译的时候,无法确定标号的段地址在哪一个寄存器中。
用assume指令将段寄存器和某个段相联系,段寄存器就真的会放在该段的地址。在程序中,我们还要使用指令对段寄存器进行设置。
3.直接定址表
利用表,在两个数据集合之间建立一种映射关系,使我们可以用查表的方法根据给出的数据得到其在另一个集合中对应数据:
(1).为了算法的清晰和简洁;
(2).为了加快运算速度;
(3).为了使程序易于扩充。
4.程序入口地址的直接定址表
可以在直接定址表中存储子程序的地址,从而方便的实现不同子程序的调用。