包含2个函数,分别是16进制数的输入输出函数,加了注释
总体来说比较满意,不过还是觉得代码臃肿了点,高手帮我优化一下下哈~~~
data segment
str1 db 'Enter a No. of 16 hexadecimal: $'
str2 db 'The Result: BX=$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea dx,str1
mov ah,9
int 21h
call scanH ;调用输入函数
mov dl,0ah
mov ah,2
int 21h
mov dl,0dh
int 21h
lea dx,str2
mov ah,9
int 21h
call printH ;调用显示16进制数字函数
mov ah,4ch
int 21h
;接收4位的16进制数
;入口:无
;出口:bx
scanH proc near
push dx
push cx
push ax
mov bx,0 ;初始化寄存器bx
mov cx,404h ;高8位用来计数,低8位存放位移位数
ls_in:
shl bx,cl ;bx向左移4位
lp_in:
mov ah,8h ;8号中断-输入一个字符,不回显
int 21h
cmp al,08h ;判断是不是退格键
jz bs_in
jmp if_in ;不是的话,跳转
bs_in: ;如果是退格键的话
cmp ch,4
jge lp_in ;没有可以删除的数字,跳回
mov ah,2h
mov dl,al
int 21h
mov dl,20h
int 21h
mov dl,08h
int 21h ;清除上一个字符
inc ch
shr bx,cl
and bl,0f0h ;bl最后4位清零
jmp lp_in
if_in: ;判断输入的字符是否合法(0-9或a-f)
cmp al,30h
jl lp_in
cmp al,66h
jg lp_in
cmp al,39h
jle do_in
cmp al,61h
jge do_in
jmp lp_in
do_in:
mov ah,2
mov dl,al
int 21h ;把输入的字符显示出来,因为使用的是不回显中断
cmp al,61h
jl next1_in ;如果输入的是0-9,跳转
sub al,'a'
add al,0ah ;转换成16进制对应的数字
jmp next2_in
next1_in:
sub al,'0' ;把Asc码转换成对应数字0-9
next2_in:
or bl,al ;把结果填入bx最后4位
dec ch ;ch自减
cmp ch,0 ;判断是否循环结束
jg ls_in
pop ax
pop cx
pop dx
ret
scanH endp
;显示16进制数
;入口:bx
;出口:无
printH proc near
push dx
push cx
push ax
mov cx,404h
lp_print:
rol bx,cl ;bx中数字向左循环移4位
mov al,bl
and al,0fh
cmp al,0ah ;判断al中数字与10的大小关系
jl next_print
add al,7 ;大于等于10的话先+7
next_print:
add al,'0' ;把数字0-9转换成对应Asc码
mov dl,al
mov ah,2
int 21h ;显示出来
dec ch ;ch自减1
cmp ch,0
ja lp_print
pop ax
pop cx
pop dx
ret
printH endp
code ends
end start
posted on 2008-04-09 21:07
Tsanie 阅读(542)
评论(0) 编辑 收藏 引用 所属分类:
个人作品