2014-04-13 43 views
0

在ARM程序集中,如何在十进制中打印寄存器中的值?这是我现在的代码。如何在十进制中打印寄存器中的值?

MOV  r3, #32   ;bit count = 32 
MOV  r5,#0; r5 will have the converted decimal number 
Loop 
MOV  r0, r2, LSR #31 
ADD  r5,r5,r0,LSL r3 
MOV  r2, r2, LSL #1   
SUBS r3, r3, #1     
BNE Loop     

我的逻辑有问题。即使我正确乘法,结果值仍然是十六进制。将十六进制值转换为相应的十进制值的方法是什么?

+1

这个不清楚。请提供一个输入示例,预期输出和实际输出。 –

+0

这里的逻辑是'MOV r5,r2'的一位一位等值。你想获得[BCD](http://en.wikipedia.org/wiki/Binary-coded_decimal)还是其他的东西?提示:如果一个转换为十进制的算法不包含某种10除法,它是_probably_错误。 – Notlikethat

回答

1

我不知道你的代码是试图做的,它没有任何意义可言..

取号123(十进制),你想打印出来,你需要把它分离成数字1,2,3,然后将它们转换为ascii,然后打印出ascii。转换为十进制ascii很容易,你只需添加0x30。

寄存器无法知道或在意它们中的位代表寄存器中的十进制数123是与寄存器中的0x7B相同的位模式,寄存器和逻辑无法知道差异。 0173八进制也是如此......

现在我们的大脑是如何把它变成1,2和3?如果你在正确的基础上,那很容易,但它仍然是一个分裂和剩余的过程。你从123开始除以10,剩余12得到3.剩下的数字就是我们最不重要的数字。我们可以重复,直到我们的结果为0,因为在那之后,我们将总是得到0余数0.所以12/10 = 1余数2给出我们的下一个数字,然后最后1/10 = 0余数1,我们完成3, 2,相反的顺序是数字。

现在ARM的通常没有分割指令,因为alu是基数2,所以你不能转换和蒙版,你必须除以10.有很多方法可以做到这一点。所以它肯定没有一个分步余数的功能,所以你将不得不寻找剩余的一个额外的步骤123/10 = 12,然后12 + 10 = 120,123-120 = 3,得到12余3重复。

最简单的实现方式,但效率最低的是减法。从123开始,并有一个循环,减去10,直到数字小于10,0)123,1)113,2)103,3)93,4)83,5)73,6)63,7)53, 8)43,9)33,10)23,11)13,12)3 12余数3.

这会给你留相反的顺序,所以你必须处理这个,记得要加上0x30给每个人做它ascii。

当然,如果你想以前瞻的顺序发现它们,并且效率稍差(取决于你的鸿沟)。 123/100 = 1,123-100 = 23,23/10 = 2,2 * 10 = 20,23-20 = 3,并且小于10。 1,2,3,但你必须猜测有多少个数字需要处理,或者一直处于最坏的情况,而不是提早出局。

所有这些在stackoverflow上已经被很多次覆盖了,同样的,我怎么划分10个问题也被打死了。请再做一些搜索。

+0

非常感谢您的回答。我能够实施重复划分以获取提醒并能够以相反顺序打印的方法。但是由于ARM程序集没有DIV指令,为了达到这个目的我重复了减法。所以这个程序对于大数量来说非常慢(如0xFFFFFFFF)。有没有更高效的方法? – User1234321232

+0

获得黑客的喜悦,或阅读http://homepage.cs.uiowa.edu/~jones/bcd/divide.html或搜索stackoverflow或谷歌转换为十进制,如何除以10已被多次覆盖。或者只需从gcc库(在gcc源代码中) –

相关问题