[PIC]アセンブラで数値を記述する場合は基数指定が必須です

PICのアセンブラで基数を明示せずに数字を指定すると、通常は16進数として認識されます。
例えばPIC16F84で、以下のコードを実行すると…

    LIST    P=16F84
    INCLUDE P16F84A.INC
    ORG 0
 
MAIN
    MOVLW   0x10
    GOTO    MAIN
 
    END



このように、Wレジスタに0x10(10進数で”16″)がセットされます。




ですがMPLABを使用している場合、この振る舞いはプロジェクトの設定で変更可能なため注意が必要です。
変更が可能なのは、基数指定を明示しない時の解釈方法で、以下の方法で設定が可能です。

MPLABのメニューより、Project -> Build Options- > Projectを選択します。


MPASMのタブをクリックすると、Default Radix(デフォルトの基数)を指定する項目があり、上から順に16進数、10進数,8進数となります。


これを、もしDecimal(10進数)に変更して上記のコードを実行すると、以下のようになります。

コードを全く変更していないにも関わらず、Wレジスタの値が0x0A(10進数で”10″)になっちゃいました。


この為、blog等にMPASMのコードをアップする場合は、基数を明示しないと、プログラムの動作がプロジェクトの設定に依存する事になってしまいます。
プログラマ側も注意が必要で、サンプルのコードを他の人から貰ったりネットからコピーしてきた場合も、このような記法がなされていないかチェックする事が必須です。

なお基数を明示する方法はMPASMの場合、以下の表記をすればOKです。

16進数
        h'0a'
        H'0a'
        0x0a
 
10進数
        d'10'
        D'10'
        .10
 
8進数
        o'12'
        O'12'
 
2進数
        b'00001010'
        B'00001010'
 
アスキー文字
        A'a'
        'a'



例えば、default radixがDecimalで有っても0x10が指定されていた場合は、以下のように16進数で指定されたと見なしてくれています。


mpasm.exeのコマンドラインオプションとしてデフォルト基数を明示する場合は、以下のオプション指定を行います
(/rとその後の文字の間にはスペースを入れません)

/rHEX
/rDEC
/rOCT




プロジェクトの設定ではなく、プログラムでデフォルト基数は以下の2通りの方法があります。

list擬似命令を使用する場合
    list r=hex
    list r=oct
    list r=dec
 
radix擬似命令を使用する場合
    radix hex
    radix oct
    radix dec



radix擬似命令は、プログラムの先頭だけではなく途中でも書く事が出来ます。
その場合、radix命令を書いた行以降でデフォルト基数が変わります。

関連記事

コメントを残す

メールアドレスが公開されることはありません。