《汇编语言》第十六章 直接定址表

16.1 描述了单元长度的标号

code segment 
	a: db 1,2,3,4,5,6,7,8
	b: dw 0

上述程序段中,code,a,b都是标号,这些标号仅仅表示了内存单元的地址

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

code segment
	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

这些指令中,标号b代表了一个内存单元,地址为code:8,长度为两个字节,使用这种包含单元长度的标号,可以简洁地访问内存中地数据,以后称为 数据标号,它标记了存储数据的单元的地址和长度,不同于仅表示地址的地址标号

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

一般来说,不在代码段中定义数据,将数据定义到其它段中,在其它段中,可以使用数据标号来描述存储数据的单元的地址和长度

注:在后面加 :的地址标号,只能在代码段中使用

将data段中a标号处的8个数据累加,结果存到b标号的字中:

assume cs:code,ds:data

data segment 
	a db 1,2,3,4,5,6,7,8
	d dw 0
data ends

code segment
start:	mov ax,data
		mov ds,ax
		
		mov si,0
		mov cx,8
		
	s: mov al,a[si]
	   mov ah,0
	   add b,ax
	   inc si
	   loop s
	   
	   mov ax,4c00h
	   int 21h
	   
code ends
end start

如果想要在代码段中直接使用数据标号访问数据,则需要伪指令assume将标号所在的段和一个段寄存器联系起来,且在代码段中指明将数据段地址放入某个段寄存器中,设置ds指向data段,方可编译

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

data segment 
	a db 1,2,3,4,5,6,7,8
	b dw 0
	c dw a,b
data ends
数据标号c存储的两个字节型数据为标号a,b的偏移地址

16.3 直接定址表

考虑:编写一个子程序
计算 sin(x) ,x={0°,30°,60°,90°,120°,150°,180°},并在屏幕中间显示结果,如sin(30)的结果显示为0.5

我们可以利用麦克劳林公式计算sin(x),y=x/180*3.1415926
可以看出,计算sin(x)需要进行多次的乘法和除法,乘除是非常费时的,它们的执行时间是加法,比较指令的5倍

我们可以不用计算sin(x),可以占用一些内存空间来换取运算的速度,将所要计算的sin(x)的结果都存储到一张表中,然后根据角度来查表,找到对应的sin(x)的值

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

16.4 程序入口地址的直接定址表

可以在直接定址表中存储字子程序的地址,从而方便实现不同子程序的调用,根据功能号查找地址表的方法,程序的结构清晰,便于扩充,如果需要增加一个新功能,那么只需要在地址表中加入它的入口地址即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值