汇编mov 十六位数报错?

输入一串十进制数,需要判断是否为数字,并将其转化成二进制和十六进制输出。

;已经得到了,在dx中 ;已经得到了,在dx中

首先我们需要将输入进行筛选,并且因为是串行输入,我们还需要整合出最终的结果。
我的想法是每一个输入都进行一个判断,如果是回车(ASCII为13),就转出,证明输入结束;
如果大于39h(9 的ASCII)或者小于30h(0 的ASCII)就直接进入下一个循环。
如果是数字,将当前的数值乘十,然后加上输入的数据,继续循环。

  • 这里采用dx寄存器,所以如果输入太大其实会爆掉,但是为了简化问题,才这样做的。
  • 我们实际上的读入为ASCII值,在加上的过程中还需要减去30h。(这里的30h表示十六进制数)
  • 最开始的清零操作我采取的是xor(异或),这样比直接move要快一些。

所以我们的实现是这样的:
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

  1. &与,按位与。两个都是1,结果才是1。其余结果取0。
    一定十进制转换成二进制数
  1. |或,按位或。两者有一个1,那么整个结果就是1。 其余结果取0。
  1. ^异或。两个值不相同取1。 其余结果取0。
注意:必须转换成二进制,然后做移位操作 相当于16/2的2次方
相当于16/23次方
相当于16*22次方
相当于16*23次方

使用的数字 0,1,2,3,4,5,6,7,

二进制进制转换为八进制方式:

对于整数,从低位到高位将二进制数的每三位分为一组,若不够三位时,在高位左面添0,补足三位,然后将每三位二进制数用一位八进制数替换,小数部分从小数点开始,自左向右每三位一组进行转换即可完成.

八进制转换为二进制方式:

只要将每位八进制数用三位二进制数替换

二进制进制转换为十六进制方式:

对于整数,从低位到高位将二进制数的每四位分为一组,若不够四位时,在高位左面添0,补足四位,然后将每四位二进制数用一位十六进制数替换,小数部分从小数点开始,自左向右每四位一组进行转换即可完成.

十六进制转换为二进制方式:

只要将每位十六进制数用四位二进制数替换

我要回帖

更多关于 codeblocks编译器错误 的文章

 

随机推荐