Assembly 在总成中除以10,结果不正确

Assembly 在总成中除以10,结果不正确,assembly,arm,integer-division,Assembly,Arm,Integer Division,我试图在arm组装中实现10除法。我遵循了第一次回答问题时提到的方法 这是我的密码 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 但是这段代码没有给出正确的结果。例如

我试图在arm组装中实现10除法。我遵循了第一次回答问题时提到的方法

这是我的密码

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

我做错什么了吗?

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

例如,以下代码将无符号的
r5
除以
10
,并用
r0
中的商:

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

用常数除法有一个相当好的公式 它有一个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网站上有代码,但我现在在这里找到了


请注意,这甚至可以在不使用后来引入的64位乘法的情况下实现。

您能进一步描述一下“不工作”吗?另外,
(2^32/10)+1
根据我的计算是
0x1999999A
)令人担忧的是,这是一个输入错误。它本身就是0x1999999A。将对其进行更改。
r9
将包含来自
UMULL
的64位乘积的低位32位(即近似商的小数部分)。整数部分将位于
r3
中。还有,你为什么要向右移动
r2
?你能解释一下你到底想计算什么吗?