其实在很多时候,我们在设计算法的时候,有的时候就会考虑利用简捷的算法,用一种映射的关系去解决我们需要解决的部分问题,利用表机制可以在两个数据集合之间建立一种映射关系,使得我们可以用查表的方法去根据给出的数据得到其在另一个集合当中对应的数据,这样做的目的一般来说有以下3个
- 1、为了算法的清晰和简洁
- 2、为了加快运算速度
- 3、为了使程序易于扩充
下面就演示下一个通过表的映射来进行,下面就演示下通过0-15十进制数和0-F十六进制数进行映射
如果我们不使用查表的方式,而是使用的是分类的情况的话,其实程序还会复杂,就比如说数值0~9和字符”0”~”9”之间的映射关系其实就是数值+30h=对应的ASCII码的值,但是10~15和”A”~”F”之间的映射关系就是数值+37h=对应字符的ASCII值,这样分情况汇编写出来就复杂了
所以这里我们采用查表的方法,首先我们要知道1个字节需要用两个十六进制数码来表示,所以我们就需要将1个字节的高四位和低四位给分开来,这里我们采用的是按位与的方法
程序如下所示
assume cs:code,ss:stack,ds:data
stack segment
db 128 dup(0) ;定义栈数据,在call指令的时候会把IP寄存器的值压栈
stack ends
data segment
table db '0123456789ABCDEF' ;表映射的值
data ends
code segment
start:mov ax,data
mov ds,ax ;设置ds段
mov ax,stack
mov ss,ax ;设置ss段
mov ax,128
mov sp,ax
mov al,10 ;al为传入的值
call show ;调用show
mov ax,4c00h
int 21h
show: push bx
push es
mov ah,al
shr ah,1
shr ah,1
shr ah,1
shr ah,1 ;利用ah取得的是高四位
and al,00001111b ;al取得的是低四位
mov bl,ah
mov bh,0
mov ah,table[bx] ;将table中的字符给ah
mov bx,0b800h
mov es,bx
mov es:[160*12+40*2],ah ;将ah的值给我们要显示的缓冲区的地址
mov bl,al
mov bh,0
mov al,table[bx];取al的值
mov si,160*12+40*2+2
mov es:[si],al ;放入数据
pop es
pop bx
ret
code ends
end start
执行结果如下所示
还有一题就是根据我们传入的值去显示出对应的sin角度的值,我们要判断我们给的数据是否是30,60,90,120,150,180里面的,如果不是说明表里面没有对应的,那么就要直接程序结束
assume cs:code,ss:stack,ds:data
stack segment
db 128 dup(0)
stack ends
data segment
ag0 db '0',0
ag30 db '0.5',0
ag60 db '0.866',0
ag90 db '1',0
ag120 db '0.866',0
ag150 db '0.5',0
ag180 db '0',0
table dw ag0,ag30,ag60,ag90,ag120,ag150,ag180 ;字符串偏移地址表
data ends
code segment
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov ax,128
mov sp,ax
mov ax,50
call show
mov ax,4c00h
int 21h
show: push bx
push es
push si
mov bx,0b800h
mov es,bx
;下面用角度值/30作为相对于table的偏移,取得对应的字符串偏移地址,放在bx中
mov ah,0
mov bl,30
div bl
cmp al, 6 ;除的结果大于6就直接返回
ja showret
cmp al, 1 ;除的结果如果小于1也直接返回
jb showret
cmp ah, 0 ;余数不为0也直接返回
jne showret
mov bl,al
mov bh,0
add bx,bx
mov bx,table[bx]
;下面显示sin(x)对应的字符串
mov si,160*12+40*2
shows:mov ah,ds:[bx]
cmp ah,0
je showret
mov es:[si],ah
inc bx
add si,2
jmp short shows
showret:pop si
pop es
pop bx
ret
code ends
end start
对于可以根据数据,直接计算出所要找的元素的位置的表的,我们称为直接定址表