问题描述
是否有可能在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 ARM,MOV
和ASR
之间的唯一区别是:
这是MOV,MOVS(寄存器)的别名。这意味着:
- 此描述中的编码被命名为与的编码匹配 MOV,MOVS(注册)。
- MOV,MOVS(寄存器)的描述给出 该指令的操作伪代码。
注意(*):
ASR ARM指令在所有体系结构中均可用。
ARMv6T2及更高版本中提供了ASR 32位Thumb指令。
ARMv4T及更高版本中提供了ASR 16位Thumb指令。