汇编语言进制转换之16进制转10进制

时间:2021-05-19

 使用8086汇编,输入一个16进制的数,程序把该16进制数转换为相应的10进制数输出

程序运行截图:

要实现这样一个程序,思路可以是这样的:

  1.由于我们读入的键盘输入是ASCII码表示的,且输入一个字符便得到一个ASCII码,如输入ab,程序中可以得到61h和62h。现在的问题是怎么把这些输入的字符表示成一个完整的数。对于这个问题,我们可以把每次输入的字符的ASCII码先转换为对应的数,0-9之间的数,根据ASCII码表发现可以用 ASCII码减30h 得到0-9对应的十六进制数值,对于a-b,用ASCII码减57h 得到a-b对应的十六进制数值。

  2.得到这些对应的数值之后,要把它们按输入顺序组合起来,这里可以用移位运算来组合,如根据输入转换得 1、2两个十六进制数值,1的二进制表示为0001,2的二进制表示为0010,把0001左移4位得到00010000,加上0010,得到0001010,00010010表示的便是12h。

  3.把输入转换为数值之后就准备要输出了,可采用除10法得到各个位上的数,如要输出110,先要把110转为 1、1、0 再把对应的数值加上30h转为ASCII码后输出,把110转换为 1、1、0,110除以10商为11,余数为0,此时余数作为个位上的数,得到个位为0;再用上一步的商11作为被除数除以10,得到商为10,余数为1,此时余数作为十位上的数,得到十位为1;重复上述步骤,商1作为被除数除以10,商0余1,得到百位为1,此时商等于0,算法结束。

DATAS SEGMENT bin dw 10 dup(?) ;存放二进制结果 buf db 5 dup(?) ;存放十进制数 各个数位上的数值 如100,存放为 1,0,0 msg1 db 'please input a hex number',13,10,'$' msg2 db 'the dec number:',13,10,'$' crlf db 13,10,'$' ;回车换行DATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX mov bx,0 ;初始化bx LEA dx,msg1 ;输出提示字符串 mov ah,9 int 21h input: mov ah,1 ;输入一个字符 int 21h sub al,30h ;把al中的ascii码转换成数值 jl init cmp al,10 ;输入的数在0-9之间跳转 jl toBin sub al,27h ;再转换为a-f cmp al,0ah ;输入的字符比a小 jl init ;结束输入 cmp al,10h ;输入的字符比f大 jge init ;结束输入 toBin: ;转换为二进制,把输入组合成意义上的数值 mov cl,4 shl bx,cl ;bx左移4位 mov ah,0 add bx,ax ;把输入后并从ascii码转换来的值与bx相加 mov bin,bx ;转换成二进制数后存到内存bin jmp input ;继续输入 init: ;初始化,准备转换 mov ax,bin mov bx,10 mov si,4 ;循环四次,最大到万位 toDec: ;转为各个数位上的数值,如100转换为1,0,0 百位为1... mov dx,0 div bx ;除10法得到各个位上的数值 mov [buf+si],dl ;余数为该位上的值,第一次循环为个位,第二次为十位...;存到内存中 dec si cmp ax,0 ;商是否为0,为0算法结束 ja toDec lea dx,crlf ;显示提示 mov ah,9 int 21h lea dx,msg2 mov ah,9 int 21h output: ;输出内存中存放的各个数位上的数值 inc si mov dl,[buf+si] add dl,30h ;转为ascii mov ah,2 int 21h cmp si,4 jb output mov ah,1 int 21h MOV AH,4CH INT 21HCODES ENDS END START

到此这篇关于汇编语言进制转换之16进制转10进制的文章就介绍到这了,更多相关汇编 16进制转10进制内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持! 

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章