如何在 ARM 汇编中将数字除以 32?

How to divide a number by 32 in ARM assembly?

有没有办法在ARM上做除法运算

int sum =0;
for (int i=0; i<32 ; i++)
{
 sum+= i*2;
 i++;
}
int avg = sum/32;

这是我的代码:

Area Prob2, CODE
Entry
mov R0,#0 //R0 = sum
mov R1,#0 //R1 = i
Loop CMP R1,#32
BGE EXT // exit loop
mul R2, R1,#2 // multiply
ADD R0,R0,R2 // the addtion
ADD R1,R1,#1
ADD R1,R1,#1
B loop
EXT
END

我找不到除法的方法,第一部分是否正确

(整数)除以 32 可以通过 右移 轻松实现,因为 32 是 2⁵。

在Java中你会写:

int avg = sum >> 5;

我不熟悉您使用的汇编语法,但going by this example我猜这将计算 R0(总和)除以 32,并将结果存储在 R1 中:

MOV R1, R0, LSR #5

您的 Java 代码是完美有效的 C 代码,这意味着您可以编译您的 C 代码并获得 asm(很可能它将成为最佳翻译)。

MOV 是一个完美有效的解决方案,但我认为编译器 (*) 会将转换转换为 ASR 而不是 MOV 很重要。来自 ARM 文档:

These instructions are synonyms for MOV instructions with shifted register second operands.

Arithmetic Shift Right. This instruction is a preferred synonym for MOV instructions with shifted register operands.

i.e.,代码:

int funct(int sum) {
    int avg;
    avg = sum>>5;
    return avg;
}

会变成:

   asr     r0, r0, #5
   bx      lr

According to ARMMOVASR的唯一区别是:

This is an alias of MOV, MOVS (register). This means:

  • The encodings in this description are named to match the encodings of MOV, MOVS (register).
  • The description of MOV, MOVS (register) gives the operational pseudocode for this instruction.

注(*):

The ASR ARM instruction is available in all architectures.

The ASR 32-bit Thumb instruction is available in ARMv6T2 and above.

The ASR 16-bit Thumb instruction is available in ARMv4T and above.