顺序程序设计——简单查表法代码转换

390 阅读4分钟

简单查表法代码转换

汇编巩固

实现一个16进制数字码转换为对应的七段代码的程序 

利用七段显示数码管,能较好的显示16进制数字(0,...9、A、B、C、D、E、F)。七段数码管的每一段对应一个二进制位。如果我们设0表示对应段亮,1表示对应段暗,那么数字码0对应以二进制形式表示的代码1000000,数字码1对应以二进制形式表示的代码1111001。如此,数字码F对应以二进制形式表示的代码0001110。这种用于表示七段数码管亮暗的代码就称为七段代码。 显然,16进制数字码与七段代码间的关系难以表示成一个简单的算术表达式,所以利用表的方法实现代码转换比较合适。 下面这个图片看成一个数字8的显示,为8时,全部亮起,假如我们要显示3,那就5和4不亮,其余亮起

image.png

image.png

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种编译调试