独自言語 picle のコンパイラ化(その13)asm_()対応 [PIC]
picleコンパイラをアップデートしました。
今回は修正2件と機能追加1件です。
上記の対応を行った picle コンパイラは「独自言語 picle compiler on PIC24FJ」の記事からダウンロードできます。
★2017/11/26 追記
上のasm_()の説明で「直値」という単語を使っていますが、「即値」との違いは??
IT用語辞典で確認してみると即値=イミディエイト、直値=リテラルということのようです。
高水準言語でソースコード中に直に書き込まれたデータのことや、そのようなデータの記述形式を即値ということがあるが、こちらは「リテラル」(literal)と呼ぶのが一般的である。
ということなので「直値」で間違っていないようです(picleが高水準言語か否かは別としてw)。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
今回は修正2件と機能追加1件です。
- 修正内容
修正は次の2件です。
- 単項演算子'+'の処理修正
絶対値を求める単項演算子が正数の変数に対して負の値を返していました。^^;;
原因はMSBをチェックしスキップ命令を生成している箇所で使ったBTSC命令のマクロ定義で bit4 が最大(0x0f)の場合、符号拡張され上位ビットがすべて1になっていました・・
#define BTSC_Ws_bit4(Ws,bit4) COND {DISP2("BTSC W%d,#%d",Ws,bit4); COND2 ¥ FWRITE(0xa70000|(bit4<<12)|ADRS_SMODE_DIR|Ws); COND3
bit4が 8 より小さい場合は正常に動くので厄介です・・
対処としては bit4 の前に long のキャストを付けました。
- "else if ("構文
"else if ("の次の文字がスペース以外の場合、エラーになるので、スペースを入れなくてもエラーにならないように修正しました。
- 単項演算子'+'の処理修正
- 機能追加
外部関数宣言機能を追加済みですが、レジスタロック解除のような数命令を追加する場合でも、アセンブラで記述後HEXファイルを作成するのは面倒なのでマシン語をpicleソースに埋め込むための asm_() という組込み処理を追加しました。
引数はニーモニックではなく、マシン語の直値なので code_() のような処理名にすべきかもしれませんが覚えやすいように asm_() にしましたw
また、この処理のみ、特例として引数が long(4バイト)になっています。
使い方としては asm_( $fe4001 ); のようになります(この例はCPUのモードをアイドルモードに移行するマシン語の埋め込み例)
マシン語を埋め込むとソースの可読性が落ちるため、大量のマシン語を埋め込むことは想定していないので1回の asm_ でマシン語を1ワードのみ埋め込めるようにしています。
上記の対応を行った picle コンパイラは「独自言語 picle compiler on PIC24FJ」の記事からダウンロードできます。
★2017/11/26 追記
上のasm_()の説明で「直値」という単語を使っていますが、「即値」との違いは??
IT用語辞典で確認してみると即値=イミディエイト、直値=リテラルということのようです。
- 即値
即値とは、アセンブリ言語や機械語で、命令が扱う対象となるデータ(オペランド)としてコード中に直に書き込まれた数値のこと。メモリやレジスタなどから読み出した値ではなく、コード中で命令語の直後に置かれている値であることからこのように呼ばれる。 - 直値
リテラルとは、コンピュータプログラムのソースコードなどで、特定のデータ型による値を直接表記する際の書式。また、そのような書式に従って記載された値。
高水準言語でソースコード中に直に書き込まれたデータのことや、そのようなデータの記述形式を即値ということがあるが、こちらは「リテラル」(literal)と呼ぶのが一般的である。
ということなので「直値」で間違っていないようです(picleが高水準言語か否かは別としてw)。
[TOP] [ 前へ ] 連載記事 [ 次へ ]