アセンブラでプログラムを書くとき、数値などのデータは、レジスタまたはメモリに格納します。
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 カピバラ父さん