在装配中除以10得不到正确的结果

时间:2014-04-14 16:48:05

标签: assembly arm integer-division

我试图通过10个臂组装来实现除法。我按照问题的第一个答案中提到的方法进行了操作 ARM DIVISION HOW TO DO IT?

这是我的代码

MOV     r2, #10         
LDR     r3,=0x1999999A   ; 1999999A == (2^32 / 10) + 1
UMULL   r9,r3,r5,r3    ;divide an integer value in r5 by 10   
MOV     r6, r9,LSR r2  ; r6 has the quotient

但是这段代码没有给出正确的结果。例如,如果我在r5中给出0x0000000B,那么在r6中这些步骤后的值是0x00066666。

我做错了吗?

2 个答案:

答案 0 :(得分:2)

uint32(x / 10)= uint64(x * 0xcccccccd)>> 35

E.g。以下代码将r5除以10r0中的商分开:

ldr    r2,=0xcccccccd
umull  r0,r1,r5,r2
mov    r0,r1,lsr #3

答案 1 :(得分:1)

通过常量http://thinkingeek.com/2013/08/11/arm-assembler-raspberry-pi-chapter-15/有一个相当好的除法写 它有一个python脚本来生成幻数和任何常量的代码。对于10,它是

/* r0 contains the argument to be divided by 10 */
ldr r1, .Lu_magic_number_10 /* r1 ← magic_number */
umull r1, r2, r1, r0   /* r1 ← Lower32Bits(r1*r0). r2 ← Upper32Bits(r1*r0) */
mov r0, r2, LSR #3     /* r0 ← r2 >> 3 */
bx lr                  /* leave function */
.align 4
  .Lu_magic_number_10: .word 0xcccccccd

arm网站上有代码,但我现在在http://www.sciencezero.org/index.php?title=ARM:_Division_by_10

找到了它

请注意,这甚至可以在没有后来引入的64位乘法的情况下进行管理。