简单查表法代码转换
汇编巩固
实现一个16进制数字码转换为对应的七段代码的程序
利用七段显示数码管,能较好的显示16进制数字(0,...9、A、B、C、D、E、F)。七段数码管的每一段对应一个二进制位。如果我们设0表示对应段亮,1表示对应段暗,那么数字码0对应以二进制形式表示的代码1000000,数字码1对应以二进制形式表示的代码1111001。如此,数字码F对应以二进制形式表示的代码0001110。这种用于表示七段数码管亮暗的代码就称为七段代码。 显然,16进制数字码与七段代码间的关系难以表示成一个简单的算术表达式,所以利用表的方法实现代码转换比较合适。 下面这个图片看成一个数字8的显示,为8时,全部亮起,假如我们要显示3,那就5和4不亮,其余亮起
assume cs:code,ds:data ;定义代码段cs和数据段ds的名称分别为code和data
data segment
;定义表tab,这张表按顺序记录了我们要显示的16进制数,这里用的是二进制数表示,分别表示十六进制的0-F
tab db 1000000b,1111001b,0100100b,0110000b
db 0011001b,0010010b,0000010b,1111000b
db 0000000b,0010000b,0001000b,0000011b
db 1000110b,0100001b,0001110b,0001110b
xcode db 8 ;待转换的16进制的数字码
;这里的xcode是一一对应到表里的,所以,我们只要在查表的实现,对表的内容进行偏移查找,就能找到对应的值
ycode db ? ;存放对应的七段代码
data ends
code segment
start:
mov ax,data ;设置DS段寄存器值
mov ds,ax ;因为不能直接对段寄存器赋值,所以要借助ax寄存器
mov bl,xcode ;这里我们使用bl来存储,取得待转换的16进制数的值
xor bh,bh ;bx高位清0,方便16位基址寄存器bx寻址
and bl,0fh ;保证bx低位的值为xcode的值,也就是我们要查的值
mov al,tab[bx] ;取得tab对应的代码, AL,[BX+0000]
mov ycode,al ;保存到ycode
mov ax,4c00h
int 21h
code ends
end start
这里还有一种方法,使用查表指xlat令进行查找
查表指令规定要用bx
assume cs:code,ds:data ;定义代码段cs和数据段ds的名称分别为code和data
data segment
;定义表tab,这张表按顺序记录了我们要显示的16进制数,这里用的是二进制数表示,分别表示十六进制的0-F
tab db 1000000b,1111001b,0100100b,0110000b
db 0011001b,0010010b,0000010b,1111000b
db 0000000b,0010000b,0001000b,0000011b
db 1000110b,0100001b,0001110b,0001110b
xcode db 8 ;待转换的16进制的数字码
;这里的xcode是一一对应到表里的,所以,我们只要在查表的实现,对表的内容进行偏移查找,就能找到对应的值
ycode db ? ;存放对应的七段代码
data ends
code segment
start:
mov ax,data ;设置DS段寄存器值
mov ds,ax ;因为不能直接对段寄存器赋值,所以要借助ax寄存器
move bx,offset tab ;取到表的偏移地址,保存到bx
mov al,xcode ;保存我们要查得项
xlat ;这里的xlat返回值就是al对应表项的值
mov ycode,al ;保存到ycode
mov ax,4c00h
int 21h
code ends
end start
以上代码就是简单查表法的一些示例,代码可以在dosbox种编译调试