符号なし整数除算マクロのサンプル

Example 15 には、符号なし整数を除算するマクロを示しています。このマクロは、以下の 4 つのパラメータを取ります。

$Bot

除数を保持するレジスタ。

$Top

命令の実行前に被除数を保持し、命令の実行後に剰余を保持するレジスタ。

$Div

除算の商が返されるレジスタ。剰余のみが必要な場合は、NULL"")を指定できます。

$Temp

計算中に使用される一時レジスタ。

Example 15. マクロを使った符号なし整数除算

        MACRO
$Lab    DivMod  $Div,$Top,$Bot,$Temp
        ASSERT  $Top <> $Bot             ; 指定されたレジスタが
        ASSERT  $Top <> $Temp            ; すべて異なっていない場合、
        ASSERT  $Bot <> $Temp            ; エラーメッセージが生成される
        IF      "$Div" <> ""
            ASSERT  $Div <> $Top         ; $Div が NULL("")でない場合のみ
            ASSERT  $Div <> $Bot         ; これら 3 つが問題になる
            ASSERT  $Div <> $Temp        ;
        ENDIF
$Lab
        MOV     $Temp, $Bot              ; 除数を $Temp に配置する
        CMP     $Temp, $Top, LSR #1      ; 以下の条件が満たされるまで $Temp を 2 倍にする
90      MOVLS   $Temp, $Temp, LSL #1     ; 2 * $Temp > $Top
        CMP     $Temp, $Top, LSR #1
        BLS     %b90                     ; b は逆方向検索を表す
        IF      "$Div" <> ""             ; $Div が NULL の場合、次の命令を省略する
            MOV     $Div, #0             ; 商を初期化する
        ENDIF
91      CMP     $Top, $Temp              ; $Temp を減算できるかどうか
        SUBCS   $Top, $Top,$Temp         ; できる場合は、実行する
        IF      "$Div" <> ""             ; $Div が NULL の場合、次の命令を省略する
            ADC     $Div, $Div, $Div     ; $Div を 2 倍にする
        ENDIF
        MOV     $Temp, $Temp, LSR #1     ; $Temp を半分にし、
        CMP     $Temp, $Bot              ; 除数より小さくなるまで
        BHS     %b91                     ; ループする
        MEND

このマクロでは、複数のパラメータが同一レジスタを使用していないかどうかをチェックします。また、剰余だけが要求されている場合には、生されるコードを最適化します。

アセンブラソースで複数の DivMod を使用している場合にラベルの多重定義を防ぐために、このマクロではローカルラベル(90、91)を使用します。

Example 16には、上記のマクロを以下のように呼び出したときに生成されるコードを示しています。

ratio  DivMod  R0,R5,R4,R2

Example 16. 除算マクロの出力

        ASSERT  r5 <> r4                   ; 指定されたレジスタが
        ASSERT  r5 <> r2                   ; すべて異なっていない場合、
        ASSERT  r4 <> r2                   ; エラーが生成される
        ASSERT  r0 <> r5                   ; $Div が NULL("")でない場合のみ
        ASSERT  r0 <> r4                   ; これら 3 つが問題になる
        ASSERT  r0 <> r2                   ;
ratio
        MOV     r2, r4                     ; 除数を $Temp に配置する
        CMP     r2, r5, LSR #1             ; 以下の条件が満たされるまで $Temp を 2 倍にする
90      MOVLS   r2, r2, LSL #1             ; 2 * r2 > r5
        CMP     r2, r5, LSR #1
        BLS     %b90                       ; b は逆方向検索を表す
        MOV     r0, #0                     ; 商を初期化する
91      CMP     r5, r2                     ; r2 を減算できるかどうか
        SUBCS   r5, r5, r2                 ; できる場合は、実行する
        ADC     r0, r0, r0                 ; r0 を 2 倍にする
        MOV     r2, r2, LSR #1             ; r2 を半分にする
        CMP     r2, r4                     ; 除数より小さくなるまで
        BHS     %b91                       ; ループする

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0473FJ
Non-ConfidentialID111311