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

问题描述

是否有可能在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,#1
ADD R1,#1
B loop
EXT
END

我找不到分割方法,对于第一部分它是否正确

解决方法

通过右移可以轻松实现

(整数)除以32,因为32是2 is。

在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文档中:

这些指令是具有移位寄存器第二个操作数的MOV指令的同义词。

算术右移。该指令是具有移位寄存器操作数的MOV指令的首选同义词。

i.e.,代码:

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

将变成:

   asr     r0,r0,#5
   bx      lr

According to ARMMOVASR之间的唯一区别是:

这是MOV,MOVS(寄存器)的别名。这意味着:

  • 此描述中的编码被命名为与的编码匹配 MOV,MOVS(注册)。
  • MOV,MOVS(寄存器)的描述给出 该指令的操作伪代码。

注意(*):

ASR ARM指令在所有体系结构中均可用。

ARMv6T2及更高版本中提供了ASR 32位Thumb指令。

ARMv4T及更高版本中提供了ASR 16位Thumb指令。