2023-04-01 11:56 — asano
カテゴリー:
アセンブラを書いているとどんな命令があるのか全体が見えてきます。
アセンブリ言語で書いても同じではと思うかもしれませんが、その場合はこんな命令無いのかなと探しに行くことはあってもどんな命令があるのか見ることはあまりないように思います。少なくとも私はそうで、新しいプロセッサを初めて触るときはニーモニック一覧を眺めて使い慣れたプロセッサの命令に相当するのはどれかといった探し方をしてしまいます。
そうすると汎用的な命令はわかりますが、知らなくてもプログラムは書けるけど使えば便利(速い)命令は置き去りになります。
一方でアセンブラを書いていると全部の命令に一通り目を通すことになります。動作は知らなくても書けますが、マニュアルに一緒に載っていれば目に入りますし、今回のRXのように別になっていても気になって調べてしまいます。まぁ好奇心の少ない人が仕事として黙々とやったらだめかもしれませんが......
そんなわけでRXの命令を見ているとつくづくC言語(とその派生)を意識した命令セットだなぁと思えるものがあります。
レジスタが32ビット固定
これはSuperHのところでも書きましたが、レジスタが32ビット長で16ビット×2や8ビット×4などに分割して使用することができません。メモリには16ビットや8ビットで書き込むことはできますが、メモリから16ビットや8ビットで読んだ値は32ビットに符号拡張かゼロ拡張されます。演算等も原則として32ビット(メモリへ書き込む命令ではそのビット数)で行なわれます。
拡張は自動的に行われるためメモリから読む命令では何ビットで読むか選択でき、ゼロ拡張のための符号無し命令(通常は符号拡張)が存在します。
5ビットディスプレースメントのレジスタ相対アドレッシング
一部の命令ではディスプレースメントが5ビットのレジスタ相対アドレッシングが使えます。これはR8
~R15
が使用できないという制限はありますが、通常の8ビットディスプレースメントを使用するより1バイト短くできるというものです。
最初こんな限られた命令を短くしても意味無いのではと思っていたのですが......
フレームポインタ相対で自動変数にアクセスする場合に非常に有効だと気付きました。ディスプレースメントはスケーリングされる(これもC言語向きですね)ので5ビットもあれば多くの関数で十分です。
仮に足りなくなっても使用頻度の高いものを優先して、残りは通常の8ビットのディスプレースメントを使えば良いだけです。
SCCnd
命令
これはフラグを参照する条件命令なのですが、条件に合ったら1を合わなかったら0をレジスタかメモリに書き込むというものです。そう比較演算子の動作そのものです。
同様に1ビット単位で1か0を書き込むBMCnd
命令というのもあります。こちらはビットフィールドを意識したのかな。
RTSD
命令
スタックフレームを解放し、必要に応じてレジスタを復帰後、リターンするというものです。
まぁこの辺りはC言語に限らず高級言語のコンパイルでは必要になるものではあります。
コメントを追加