当前位置: 代码迷 >> 驱动开发 >> ARM中除法要怎么实现
  详细解决方案

ARM中除法要怎么实现

热度:11   发布时间:2016-04-28 10:41:12.0
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?
  相关解决方案