如何在 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 ARM,MOV
和ASR
的唯一区别是:
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.
有没有办法在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 ARM,MOV
和ASR
的唯一区别是:
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.