如何在ARM中进行划分?

时间:2013-11-07 19:10:08

标签: assembly arm division

我试图找到如何在ARM中进行除法,因为没有DIV命令。如果可以通过乘以浮点数[/9 = *0.09],减法或使用库来完成。任何方式都可以。

目前我正在使用这样的循环使用减法进行除法但是我没有使用小数:

MOV R0,#70 ;Fahrenheit Temperature
SUB R1,R0,#32 ; Subtracting 32
MOV R4,#0 ;Counter

LOOP 

   ADD R4,R4,#1; Counter+1 ->Is the answer of the division without decimals
   SUB R1,#9
   CMP R1,#0
   BPL LOOP
   MOV R1,R4

基本上我正在做的是我有温度70,我减去32然后我得到38.然后在循环中我每次取9,直到提醒小于9.使用正常除法的答案是4.22222。我得到5.所以我的结果不那么准确。

2 个答案:

答案 0 :(得分:3)

如果您只想将r0中的整数值除以9,则可以使用以下值进行近似:

ldr r3,=0x1C71C71D   # 1C71C71D == (2^32 / 9) + 1
umull   r9,r3,r0,r3

r3现在包含商的整数部分,r9包含按2 ^ 32缩放的小数部分。要得到余数,你只需将商的整数部分乘以9,然后从原始值中减去结果。

答案 1 :(得分:1)

迈克尔的答案是正确的,如果你将数字除以一个常数,你需要一个整数结果。你不会得到你想要的分数部分。

如果你需要一个浮点结果,你需要一个浮点除法函数,这在软件和asm没有FPU的架构上很难实现。 ARMv7及更高版本默认使用FPU / SIMD,某些ARMv6及以下版本也有FPU,因此您可以直接在硬件中进行划分

定点解决方案可能更容易,只需将数字除以正常整数除法,但记得在计算后调整结果。当然,定点数不会像浮点那样具有大的动态范围,但在你的情况下,我认为范围就足够了。您还可以将余数乘以10 n n是您需要的十进制符号后面的位数,然后再用上面的除数除以得到小数部分

例如,要获得具有3位精度的22/9的结果,请执行以下操作:

22/9   = 2 remains 4
4*10^3 = 4000
4000/9 = 444
→ 22/9 = 2.444

为了获得更高的精度,只需将剩余部分乘以10的更大功率