ASCII码说明
48~57: '0'~'9'
65~90: 'A'~'Z'
97~122: 'a'~'z'
十进制转二进制
(输入十进制数保存到BX)
dec2bin proc near
mov bx, 0 ; 清空BX
newchar: ; 读取一个字符
mov ah, 1 ; 字符输入的中断
int 21h ; 输入到al
sub al, '0' ; ASCII转换成数字
jl exit ; 小于'0'则停止
cmp al, 9d
jg exit ; 大于'9'则停止
cbw ; 将AL扩展到AX
xchg ax, bx ; 下面几步是将BX原本的内容乘10
mov cx, 10d
mul cx ; 隐含的乘数在AX中
xchg ax, bx ; BX已经乘10
add bx, ax ; 将输入的数字加到BX
jmp newchar
exit:
ret
dec2bin endp
十六进制转二进制
(输入十六进制数保存到BX)
hex2bin proc near
mov bx, 0
newchar:
mov ah, 1
int 21h
sub al, '0' ; 转换成数字
jl exit ; 不是0~F则停止
cmp al, 10d
jl add_to ; 是0~9
or al, 20h ; 转化成小写字母
sub al, 'a'-10-'0' ; 可能是'a'~'f',转换成实际的值10~15
cmp al, 10d
jl exit
cmp al, 15d
jg exit
add_to: ; 加到BX上
mov cl, 4
shl bx, cl ; BX乘16(逻辑左移4位)
mov ah, 0
add bx, ax
jmp newchar
exit:
ret
hex2bin endp
二进制转十进制
(将BX中的数值按十进制输出)
bin2dec proc near
mov cx, 10000d
call dec_div ; 万
mov cx, 1000d
call dec_div ; 千
mov cx, 100d
call dec_div ; 百
mov cx, 10d
call dec_div ; 十
mov cx, 1d
call dec_div ; 个
ret
bin2dec endp
;-------------------------
dec_div proc near ; BX/CX,并输出商
mov ax, bx ; 被除数低16位在AX
mov dx, 0 ; 高16位在DX
div cx ; 除以CX,商在AX,余数在DX
mov bx, dx ; 余数放回BX
mov dl, al ; 只需要商的8位
add dl, '0' ; 转换成ACSII并输出
mov ah, 2
int 21h
ret
dec_div endp
二进制转十六进制
(将BX中的数值按十六进制输出)
bin2hex proc near
mov ch, 4 ; 输出4位十六进制数
rotate:
mov cl, 4 ; 下面是输出BX的高4位
rol bx, cl ; BX循环左移4位(高四位到了低四位)
mov al, bl
and al, 0fh ; 现在al保存的就是BX高四位的值
add al, '0'
cmp al, '9'
jle printit
add al, 'A'-10-'0' ; 如果是大于9,则转成16进制字符'A'~'F'
printit:
mov dl, al ; 输出字符
mov ah, 2
int 21h
dec ch
jnz rotate
ret
bin2hex endp