assembly - 如何在 ARM 上进行整数(有符号或无符号)除法?

标签 assembly arm integer-division instruction-set cortex-a8

我特别致力于 Cortex-A8 和 Cortex-A9 的研究。我知道有些架构没有整数除法,但是除了转换为 float 、除法、转换为整数之外,最好的方法是什么?或者这确实是最好的解决方案?

干杯! =)

最佳答案

通过执行 64 位乘法和右移可以快速完成除以常数值,例如,如下所示:

LDR     R3, =0xA151C331
UMULL   R3, R2, R1, R3
MOV     R0, R2,LSR#10

这里 R1 除以 1625。 计算如下:64bitreg(R2:R3) = R1*0xA151C331,那么结果就是高32bit右移10:

R1*0xA151C331/2^(32+10) = R1*0.00061538461545751488 = R1/1624.99999980

您可以根据以下公式计算自己的常数:

x / N ==  (x*A)/2^(32+n)   -->       A = 2^(32+n)/N

选择最大的n,其中A < 2^32

关于assembly - 如何在 ARM 上进行整数(有符号或无符号)除法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8348030/

相关文章:

c - 在 GCC 中不能除数的原因是什么

c - 如何使用 ARM gcc 7.3 生成以下 arm 汇编程序输出?

c - 这段c代码有什么问题?

assembly - AVR 微架构如何能够仅在 1 个时钟周期内从 GP 寄存器获取 2 个操作数到 ALU?

java - CPMXCG(比较和交换)在多处理器机器上到底如何工作?

assembly - MIPS 汇编乘法并将 Hi 和 Lo 移入寄存器

linux - 如何为 Raspberry Pi Zero W 交叉编译 Rust 代码

file - 从程序集中的文件读取时,为什么会出现打开错误?

python - 为什么 1//0.1 == 9.0?

python - python 3中long int除法的区别