我试图通过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。
我做错了吗?
答案 0 :(得分:2)
uint32(x / 10)= uint64(x * 0xcccccccd)>> 35
E.g。以下代码将r5
除以10
与r0
中的商分开:
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位乘法的情况下进行管理。