汇编语言模块化设计:子程序中涉及到了参数传递。在参数传递中,最常用的也是最自然的就是寄存器传递参数。但是由于寄存器个数有限,因此只适合传递少量数据。
"十六进制显式程序“是出于熟悉汇编操作来写的。它的作用是将给出的二进制数值转化为十六进制数并且以ASCII码的形式在屏幕上写出来。
思路
4位二进制数=1位十六进制数。0 ~ 9、A ~ F分别对应的ASCII码分别为30H ~ 39H、41H ~ 46H。
因此对于十六进制0~9来说,+30H就可以转化为ASCII的0到9;
对十六进制的A ~ F来说,+30H+7就可以转化为 ASCII的 A~F。
以下程序为16位8086处理器的汇编指令
include io.inc
.model small
.stack
.data
regw db 'AX=',4 dup(0),'H','$'
.code
.startup
xor bx,bx
mov ax ,13ach ;将要转化的数字。(在机器中为二进制)
mov cx,4 ;循环4次
again: rol ax,1
rol ax,1
rol ax,1
rol ax,1 ;不带进位的循环左移,将高4位移到低4位
push ax
call translate
mov regw+3[bx] ,al ;因为regw前面有3位,所要从regw[3]开始
pop ax
inc bx ;bx自增1
loop again
mov dx,offset regw
mov ah,9
int 21h
.exit
translate proc ;子程序开始
and al,0fh; ;质保留下了 al的低4位
or al,30h ;给al加上了30h
cmp al,39h;查看是否小于等于39h(对应十进制的9)
jbe labe
add al,7
labe: ret
translate endp
end
另一种子程序的写法
translate proc
push bx ;保护起来bx
and al,0fh;
mov bx ,ax
mov al, ASCII[bx] ;以数组的形式查找,十分巧妙
pop bx
ret
ASCII db '0123456789ABCDEF'
translate endp