本文为《汇编语言程序设计》1603小节例程。点击链接…进课程主页。
问题:以十六进制的形式在屏幕中间显示给定的byte 型数据。
分析:先将一个byte的高4位和低4 位分开,显示对应的数码字符
最简解决方案:最简方案:建立一张表,表中依次存储字符’0’~’F’,通过数值0~15直接查找到对应的字符。
程序:
assume cs:code
code segment
start: mov al,12h
call showbyte
mov ax,4c00h
int 21h
;子程序:
;用al传送要显示的数据
showbyte:
jmp short show
table db '0123456789ABCDEF' ;字符表
show: push bx
push es
push cx
mov ah,al
mov cl,4
shr ah,cl ;右移4位,ah中得到高4位的值
and al,00001111b ;al中为低4位的值
mov bl,ah
mov bh,0
mov ah,table[bx] ;用高4位的值作为相对于table的偏移,取得对应的字符
mov bx,0b800h
mov es,bx
mov es:[160*12+40*2],ah
mov bl,al
mov bh,0
mov al,table[bx] ;用低4位的值作为相对于table的偏移,取得对应的字符
mov es:[160*12+40*2+2],al
pop cx
pop es
pop bx
ret
code ends
end start
应用示例:为加快运算速度而采用查表方法
问题:编写程序,计算sin(x),x∈{0°,30°,60°,90°,120°,150°,180°},并在屏幕中间显示计算结果。
空间换时间方案:将所要计算的sin(x) 的结果都存储到一张表中,然后用角度值来查表,找到对应的sin(x)的值。
具体方法:(1)用ax向子程序传递角度;(2)以 角度值/30 为table 表中的偏移,可以找到对应的字符串的首地址。
参考程序:
assume cs:code
code segment
start: mov al,60
call showsin
mov ax,4c00h
int 21h
showsin:
jmp short show
table dw ag0,ag30,ag60,ag90,ag120,ag150,ag180 ;字符串偏移地址表
ag0 db '0',0 ;sin(0)对应的字符串“0”
ag30 db '0.5',0 ;sin(0)对应的字符串“0.5”
ag60 db '0.866',0 ;sin(0)对应的字符串“0.866”
ag90 db '1',0 ;sin(0)对应的字符串“1”
ag120 db '0.866',0 ;sin(0)对应的字符串“0.866”
ag150 db '0.5',0 ;sin(0)对应的字符串“0.5”
ag180 db '0',0 ;sin(0)对应的字符串“0”
show: push bx
push es
push si
mov bx,0b800h
mov es,bx
;以下用角度值/30 作为相对于table的偏移量,取得对应的字符串的偏移地址,放在bx中
mov ah,0
mov bl,30
div bl
mov bl,al
mov bh,0
add bx,bx
mov bx,table[bx]
;以下显示sin(x)对应的字符串
mov si,160*12+40*2
shows: mov ah,cs:[bx]
cmp ah,0
je showret
mov es:[si],ah
inc bx
add si,2
jmp shows
showret:
pop si
pop es
pop bx
ret
code ends
end start