随笔 - 28  文章 - 0 评论 - 77 
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(27)

随笔分类(25)

随笔档案(28)

文章分类

相册

首页连接

搜索

  •  

积分与排名

  • 积分 - 47321
  • 排名 - 124

最新评论

阅读排行榜

评论排行榜

包含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 阅读(543) 评论(0)  编辑 收藏 引用 所属分类: 个人作品
只有注册用户登录后才能发表评论。