【笔记】8086汇编-直接定址表

前言:本篇仅仅是笔记,整理于2017/9/4,结构可能会略有混乱,见谅。

-引入:这一章,我们讨论如何有效合理地组织数据,以及相关的编程技术。

-【16.1  描述了单元长度的标号——数据标号】

–将标号后面的冒号“:”去掉,我们可以给标号一个明确的数据类型,比如:a db 0, b dw 0, c dd 0。它们代表了相应数据的段地址和偏移地址,在编写程序时,我们可以直接将这个标号当做个内存单元来使用(比如与寄存器互传数据、自增、自减、直接传入数据),或者比如我们的标号是a(假设地址为2000:0),那么a[si]的意思就是2000:[0+si]。【我们可以使用a[bx+si+idata]】

–需要注意:带有冒号的地址标号只可以在代码段中使用的。

–我们也可以对数据标号使用xxx ptr来限定其类型,这在有时数据类型不匹配时很好用。

-【16.2  在其它段中使用数据标号】

–注意:需要在assume将标号所在段与段寄存器连接起来,否则编译器在编译时会找不到。【这是编译器工作需要,而不是程序运行需要】

–数据标号代表着对应寄存器的段地址与偏移地址,比如,我们在assume中将data段对应到es,那么我们下面使用这里的数据标号时,段地址就是执行该指令时的实际es中的段地址,无论其是否正确,所以我们在代码中应当先将data段段地址给了es,这样才能将开辟出来的空间与指向的空间匹配。

–seg操作符(segment),功能为取得某一标号的段地址。

-【16.3  直接定址表】

–我们使用数据标号来建立一个表(可以存放数据,或者是偏移地址),再将与我们要解决的问题相关的数据通过一定的方式转化为正确的序号(从0开始),得到一种对应关系。

-【16.4  使用直接定址表】

–提示:我们可以使用直接定址表来设置一个子程序选择机制,将直接定址表中存储子程序偏移地址。需要注意的时,这些偏移地址是在编译时就会被固定,所以,无法在运行期变更,请一定不要在运行期对代码位置进行随意更改,这样会导致访问不到正确的指令。【我们可以使用一种等价变换——即变换后与变换前具有相同的偏移地址,这种方法一般被我们用来设计中断例程】