读书人

ARM中除法要怎么实现

发布时间: 2012-12-14 10:33:07 作者: rapoo

ARM中除法要如何实现?
请问在ARM汇编中除法要如何实现?例如:求一组数的平均值?要怎么实现?
[最优解释]
这个跟你的实际情况有关系。
1,整数除法
a,被除数是常数。
比如你要求6个成绩的平均数,那么SUM/6 = SUM*(1/6)=SUM*(0.16666)=SUM*(5461)/32768
=SUM*(5461)>>15
b,被除数是变量
可以采用以下除法宏:
**************************************************************************
无符号整数除法宏示例
Example 2.10 显示了一个执行无符号整数除法的宏。 该宏采用以下四个参数:

$Bot
存放除数的寄存器。

$Top
在执行指令之前存放被除数的寄存器。 在执行指令后,该寄存器将存放余数。

$Div
存放除法的商的寄存器。 如果仅需要求余数,则该参数可以为 NULL ("")。

$Temp
在计算期间使用的临时寄存器。

Example 2.10.


MACRO

$Lab DivMod $Div,$Top,$Bot,$Temp

ASSERT $Top <> $Bot ; Produce an error message if the

ASSERT $Top <> $Temp ; registers supplied are

ASSERT $Bot <> $Temp ; not all different

IF "$Div" <> ""

ASSERT $Div <> $Top ; These three only matter if $Div

ASSERT $Div <> $Bot ; is not null ("")

ASSERT $Div <> $Temp ;

ENDIF

$Lab

MOV $Temp, $Bot ; Put divisor in $Temp

CMP $Temp, $Top, LSR #1 ; double it until

90 MOVLS $Temp, $Temp, LSL #1 ; 2 * $Temp > $Top

CMP $Temp, $Top, LSR #1

BLS %b90 ; The b means search backwards

IF "$Div" <> "" ; Omit next instruction if $Div is null

MOV $Div, #0 ; Initialize quotient

ENDIF

91 CMP $Top, $Temp ; Can we subtract $Temp?



SUBCS $Top, $Top,$Temp ; If we can, do so

IF "$Div" <> "" ; Omit next instruction if $Div is null

ADC $Div, $Div, $Div ; Double $Div

ENDIF

MOV $Temp, $Temp, LSR #1 ; Halve $Temp,

CMP $Temp, $Bot ; and loop until

BHS %b91 ; less than divisor

MEND

该宏会检查是否任何两个参数都没有使用相同的寄存器。 如果只需要计算余数,该宏还会优化所生成的代码。

如果在汇编程序源中多次使用了 DivMod,则为了避免多次定义标签,该宏将使用局部标签 (90, 91)。 有关详细信息,请参阅局部标签。

Example 2.11 显示了按如下方式调用此宏时它所生成的代码:


ratio DivMod r0,r5,r4,r2

Example 2.11.


ASSERT r5 <> r4 ; Produce an error if the

ASSERT r5 <> r2 ; registers supplied are

ASSERT r4 <> r2 ; not all different

ASSERT r0 <> r5 ; These three only matter if $Div

ASSERT r0 <> r4 ; is not null ("")

ASSERT r0 <> r2 ;

ratio

MOV r2, r4 ; Put divisor in $Temp

CMP r2, r5, LSR #1 ; double it until

90 MOVLS r2, r2, LSL #1 ; 2 * r2 > r5



CMP r2, r5, LSR #1

BLS %b90 ; The b means search backwards

MOV r0, #0 ; Initialize quotient

91 CMP r5, r2 ; Can we subtract r2?

SUBCS r5, r5, r2 ; If we can, do so

ADC r0, r0, r0 ; Double r0



MOV r2, r2, LSR #1 ; Halve r2,

CMP r2, r4 ; and loop until

BHS %b91 ; less than divisor
**********************************************************************


2,如果是小数除法。(被除数 除数有小数或者是商需要小数)
这种情况需要做定点化处理,先用指数尾数的方式表示被除数,除数,然后用相应的定点数除法运算。你所要的应该不是这种情况,所以就不细说了。

[其他解释]
旧的版本的arm指令集是没有除法指令的,armV7(cortex)以后好像增加了除法指令
旧版本中arm的除法是以函数的形式提供,一般编译环境自带的库都会提供除法函数
具体的做法就是把除法转换成乘法来做
比如计算 x/3, 也就是x*(1/3)
而 1/3 可以转换为这样一个数列 a0*(1/2) + a1*(1/4) + a2*(1/8) + ... + aN*((1/2)^N)
取适当的近似值,求出 a0-aN, 然后做移位和加法就可以得出结果
[其他解释]
可以用移位来实现除法,也可以用除法指令来实现。
[其他解释]
同意楼上
[其他解释]
楼上正解。
ARM7 ARM9系列都没有除法指令,需要使用软件实现。
或者直接
[其他解释]
楼上的貌似话没说完?
[其他解释]
顶一下,共同学习
[其他解释]
支持浮点配置的gcc可以直接编译除法的
[其他解释]
除法都没有?51单片机里面都有除法指令的。
[其他解释]
不知道在arm中右移能不能实现除法
[其他解释]
移位----比较----相减.....没有FPU的处理器可能要这样做除法.
[其他解释]


除法需要支持浮点运算,比较少的arm处理器具备这种能力吧!

[其他解释]
不错呀,哈哈哈

读书人网 >驱动开发

热点推荐