ARM中如何做除法?

Ant*_*lou 5 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
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ael 5

如果您只想将整数值除以r09,您可以使用以下近似值:

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

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

  • 这是[除以乘](http://stackoverflow.com/questions/5558492/divide-by-10-using-bit-shifts)。阅读更多信息[此处](http://stackoverflow.com/questions/16218228/fast-division-on-gcc-arm) (2认同)