常用ASCII码
48 ~ 57: '0' ~ '9',65 ~ 90: 'A' ~ 'Z',97 ~ 122: 'a' ~ 'z'
十进制转二进制
输入十进制数保存到BX
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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中的数值按十进制输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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中的数值按十六进制输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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
|