输入一串十进制数,需要判断是否为数字,并将其转化成二进制和十六进制输出。
;已经得到了,在dx中 ;已经得到了,在dx中
首先我们需要将输入进行筛选,并且因为是串行输入,我们还需要整合出最终的结果。
我的想法是每一个输入都进行一个判断,如果是回车(ASCII为13),就转出,证明输入结束;
如果大于39h(9 的ASCII)或者小于30h(0 的ASCII)就直接进入下一个循环。
如果是数字,将当前的数值乘十,然后加上输入的数据,继续循环。
所以我们的实现是这样的:
ja、jb这些跳转指令在,shl、shr这样的位移指令在,右侧目录快速查找。
十进制转其他的进制,最简单的办法其实就是直接进行除法,但是这样会造成我们每一次得到的数据是反着的,需要进行压栈出栈不好处理;另外这样实现也十分麻烦。
这里我们采取的是左移位方式,通过每一次移动一位到CF标志位,然后通过跳转指令来进行判断。
(另外一个思路是SF位,也是使用对应的跳转指令)
二进制数一共是16位,如果前面很多个0就不好看,所以我们利用一个循环将前面的0吃掉。
此时我们的数据在dx寄存器中。(dx要输出,所以又放在bx中)
throw循环就是将SF为零的部分去掉。
注意到我们有一个ok1和2(命名规范就不要吐槽了),这是因为第一个跳出循环的一定为SF = 1,所以我们需要先进行输出。
这个就不能一次移动1位了,我采取的是先复制,然后一次移动四位。
内容还是在dx中,我们将其复制到ax中,然后取最高的四位,然后移动到dl第四位,这样数据顺序就是正确的。(源码中有一个and 0f000h,其实是没必要的)
对于一个在al低四位的十六进制数,我这里有一个现成的转ASCII子程序htoa,然后将结果打印输出即可。
不过这部分我我就没有添加去0功能,确实不太好处理……
希望对大家有所帮助,多谢您的浏览!
)来得到每一位数,即十进制数
这里没有处理少于或多于
十进制数制系统包含数字0,1,2,3,4,5,6,7,8,9
计算机存储数据采用二进制
十进制4 转换 二进制0100
相当于16/2的3次方
相当于16*2的2次方
相当于16*2的3次方
使用的数字 0,1,2,3,4,5,6,7,
二进制进制转换为八进制方式:
对于整数,从低位到高位将二进制数的每三位分为一组,若不够三位时,在高位左面添0,补足三位,然后将每三位二进制数用一位八进制数替换,小数部分从小数点开始,自左向右每三位一组进行转换即可完成.
八进制转换为二进制方式:
只要将每位八进制数用三位二进制数替换
二进制进制转换为十六进制方式:
对于整数,从低位到高位将二进制数的每四位分为一组,若不够四位时,在高位左面添0,补足四位,然后将每四位二进制数用一位十六进制数替换,小数部分从小数点开始,自左向右每四位一组进行转换即可完成.
十六进制转换为二进制方式:
只要将每位十六进制数用四位二进制数替换