カピバラ父さんのプログラミング処方箋~レジスタの役割と配役

アセンブラでプログラムを書くとき、数値などのデータは、レジスタまたはメモリに格納します。

C言語など高級言語とは異なり、intとかcharとか変数の型はなく、 2進数のビットデータを左から右へと移す操作だけで、あらゆる情報を処理します。

このため、レジスタやメモリの役割を決めるのはプログラマの権限であり責任でもあります。

このことがマシン語プログラミングのハードルを上げている一因ではないかと思います。

プログラム開始時のレジスタの役割

68000CPUには、d0からd7のデータレジスタと、a0からa7のアドレスレジスタ、 それからプログラムカウンタpc、ステータス・レジスタsrがあります。

a7レジスタはスタックポインタとしての固有の役割が与えられていますが、 他のレジスタはプログラマの裁量で役割を決めてもいいし、決めなくてもいいです。

プログラムを実行した直後のアドレスレジスタの各値には、Human68kの手土産で 初期値が入っています。プログラムの内容によっては活用する機会があるかもしれません。

a0メモリ管理ポインタ
a1プログラム領域の終端アドレス+1
a2コマンドライン
a3環境変数
a4プログラムの実行開始アドレス
a5不定
a6不定
a7親プロセスのスタックポインタ
pcプログラムの実行開始アドレス(a4と同じ)

a0のメモリ管理ポインタおよびプロセス管理ポインタについては、環境構築系のプログラムを作るときに 有用な情報が含まれています。
ゲームアプリを制作する場合、自分のプログラムが使ってよいメモリの上限アドレスが、 8(a0)に指定されているので、ワークエリア(BSS,STACK)を自前で管理する場合には、 この値と比較してメモリが足りているかのチェックを行うこともあります。

a1の値は、コンバータのところでも説明していますが、.Xファイルの場合、BSS,STACKセクションを加味した プログラム用の領域アドレスの終わりになっていますが、.Rファイルの場合は、TEXT,DATAセクションの末尾になります。

a2のコマンドラインというのは、1バイト目に文字数があり、2バイト目以降はコマンドライン文字列が入ります。
パイプ処理を使う場合は、パイプ文字の手前までです。

a3の環境変数は、最初に環境変数用のバッファサイズが1ロングワードで入っていて、 続いて環境変数の設定が1行毎に、ゼロで終端する文字列で連続しています。

プログラム中でのレジスタの配役例

上にも書きましたが、プログラム中で、データレジスタとアドレスレジスタをどのような用途に 使うかはプログラマの裁量です。

データをメモリに置くかレジスタに置くかでは処理効率に差がでるため、できるだけ データレジスタを中心に処理を考えたいところですが、レジスタの数は有限です。

となると、頻繁にアクセスするデータはできるだけレジスタに割り当てるのが得策になります。

以下は、私がプログラムを作るときに習慣化している、レジスタの用途です。 絶対的なルールではありませんが、ある程度パターン化することは、デバッグを容易にし、 タイプミスや設計ミスを減らす効果があると考えて実践しています。

d0作業用、兼サブルーチンからの戻り値
d1,d2,d3,d4サブルーチンへの引数値、兼作業用
d5一時保存変数
d6ループ処理用カウンタ
d7ループ処理用カウンタ
a0作業用、兼サブルーチンからのポインタ戻し用
a1サブルーチンへの引数:文字列などのバイトデータ、兼作業用
a2処理対象の構造体
a3比較対象の構造体(読み込み用)
a4,a5作業用(あまり使わない)
a6ワークエリア先頭アドレス
a7スタックポインタ

プログラミング処方箋へ

Copyright©2026 カピバラ父さん