在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
我的逻辑有些不对劲。即使我正确乘法,结果值仍然是十六进制。将十六进制值转换为相应的十进制值的方法是什么?
答案 0 :(得分:1)
我不知道你的代码试图做什么,根本没有任何意义..
取数字123(十进制)并想要将其打印出来,需要将其分成数字1,2,3,然后将它们转换为ascii然后打印出ascii。转换为ascii为十进制很容易,你只需添加0x30。
寄存器无法知道或关心它们中的哪些位表示寄存器中的十进制123与寄存器中的0x7B的位模式相同,寄存器和逻辑无法区分。同样适用于0173八进制...
现在我们的大脑是如何将123转为1,2,3?如果你在正确的基地,这很容易,但它仍然是一个分裂和剩余的过程。你首先将123除以基数10,得到12余数3.剩余部分得到我们最不重要的数字。我们可以重复这一点,直到我们的结果为0,因为在那之后我们将总是得到0余数0.所以12/10 = 1余数2给出我们的下一个数字,然后最后1/10 = 0余数1我们完成3, 2,1是相反的顺序是数字。
现在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,49,33,10)23,11)13,12)3,12剩余3。
这将以相反的顺序给你剩余的,所以你必须处理它,并记得为每个添加0x30以使其成为ascii。
当然,如果你想以正向顺序发现它们并且效率稍低(取决于你的鸿沟)。 123/100 = 1,023-100 = 23,23 / 10 = 2,2 * 10 = 20,23-20 = 3且小于10完成。 1,2,3按正向顺序排列,但你必须一直猜测要处理多少个数字或最坏情况,而不是提早出局。
所有这些在stackoverflow上已被很多次覆盖,同样我如何除以10的问题也被打死了。请多搜索一下。