汇编关于查表机制

其实在很多时候,我们在设计算法的时候,有的时候就会考虑利用简捷的算法,用一种映射的关系去解决我们需要解决的部分问题,利用表机制可以在两个数据集合之间建立一种映射关系,使得我们可以用查表的方法去根据给出的数据得到其在另一个集合当中对应的数据,这样做的目的一般来说有以下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

这里写图片描述
对于可以根据数据,直接计算出所要找的元素的位置的表的,我们称为直接定址表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值