如何解决如何在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 ARM,MOV
和ASR
之间的唯一区别是:
这是MOV,MOVS(寄存器)的别名。这意味着:
- 此描述中的编码被命名为与的编码匹配 MOV,MOVS(注册)。
- MOV,MOVS(寄存器)的描述给出 该指令的操作伪代码。
注意(*):
ASR ARM指令在所有体系结构中均可用。
ARMv6T2及更高版本中提供了ASR 32位Thumb指令。
ARMv4T及更高版本中提供了ASR 16位Thumb指令。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。