68000アセンブラの概要

68000のレジスタ

メモリのアドレッシング

メモリには,1バイトごとにアドレスがついている. 2バイトで1ワードを構成するが, 68000では,1ワードというとき,上位バイトは偶数番地,下位バイトは 奇数番地でなければならない.

命令語や,16ビットデータは,ワード単位であり, 必ず偶数番地から始まっていなければならない. これを間違えると,アドレスエラーが起こり,例外処理が始まる.

68000アセンブラ(スライド資料,演習問題)

ここでは,命令セットの「すべて」を説明することはできない. そこで,ひとつひとつの命令の詳細はマニュアルを見ていただくことにして, ここでは,命令セットのうちいくつかの重要な命令語や,特殊な命令語の説明 (前期のソフトウェア実験を行うのに十分な説明)に絞りたい.

アセンブラ言語の特徴

PascalやCなどの高級言語のコンパイラも、人間が書いたプログラム から機械語命令列を生成する. 高級言語では,プログラムと機械語命令は一対一に対応しない

算術・論理演算命令

代表的な加算命令には,ADD,ADDA,ADDI,ADDQがある. これらの命令の機能は同じである.

ADDAはアドレスレジスタへの加算,ADDI,ADDQは定数の足し算で ある. それ以外の場合は,ADDを使う. ADDIとADDQは似ているが,ADDQは1から7までの足し算の場合に 使える. その名の通り,ADDQの方がADDIよりも倍くらい速い.

減算は加算に対応して,SUB,SUBA,SUBI,SUBQなどがある.

比較は,同様に,CMP,CMPA,CMPIがある. しかし,CMPQはないので, 代わりにCMPIを使う.

乗除算については,それぞれ符合付きと符合なしが用意されている. 符号付きの乗算がMULS,符号無しの乗算がMULU, 符号付きの乗算がDIVS,符号無しの乗算がDIVUである. 乗算は16ビット×16ビットで答えが32ビットである. 除算は32ビット÷16ビットで商が16ビット,余りが16ビットである.

その他,算術命令にはCLR,TAS,TSTがある. CLRは,0にセット,TSTは,0との比較である. TASは,「テストアンドセット」の機能を実現します(テストアンドセット の機能は,オペレーティングシステムの講義で必ず出てくるはずです).

データ移動命令

データの移動には,MOVE,MOVEM,LINK,UNLINK,LEA命 令があり,最も良く使うのはMOVE命令である.

MOVEMは,指定されたされた複数のレジスタとメモリの間で一度にデータ転送 を行うもので,サブルーチン先頭でのレジスタ退避,サブルーチン末尾での レジスタ回復に便利である.

LINK,UNLINK命令は,サブルーチン内でのローカルエリアの確保, 解放に便利である.

LEA命令は,実効アドレスの値をそのままアドレスレジスタやスタックに 書いてしまうもので,引数のポインタをスタックに積んでサブルーチンに渡す ときなどに便利である.

ジャンプとサブルーチンコール

ジャンプには,BRA,JMP命令が, サブルーチンコールには,BSR,JSR命令が使われる.

このように,ジャンプ,サブルーチンコールにはそれぞれ2種類の命令があ る. BRA,BSRの飛び先指定は,ディスプレースメントが8ビット以内のPC 相対に制限される. 一方,JMP,JSRの飛び先指定には,そのような制限はない.

リロケータブルなプログラムの作成には,PC相対を使う必要がある. もし,そのディスプレースメントが8ビット以内なら,BRA,BSRの方が プログラムが短い.

条件ジャンプは,Bcc,DBccがある. その条件判定には,コンディションコードレジスタを見て行われる.

サブルーチンからのリターンはRTS命令である. RTS命令および例外からのリターンRTE命令はいずれもスタックの深さに 注意する必要がある.

アドレッシングモード

68000の多くの命令は,さまざまな実効アドレスの指定形式(アドレッシ ングモード)をもっている.

最も基本的なアドレッシングモードは, データレジスタまたはアドレスレジスタに対するアドレッシングである.

命令語の中身

命令語は,オペコードと,オペランドの組である. オペコードというのは,命令語の種類を表す記号であり, オペランドでは,命令語の処理を行うべき対象を指定する.

多くの場合,オペランドの長さが,バイトか,ワードか,ロングワードであるかと いうことを指定できる.

MOVE命令では, オペコードは上位2ビットであり,その次にオペランドの長さを2ビットで指定す る. 最後に,オペランドを12ビットで指定する. 以上のようにMOVE命令の長さは合計1ワードである.

一方,AND命令やADD命令では,最初の4ビットがオペコードであり,そ の後12ビットでオペランドとその長さを表現する.

以上のように,命令語とそのビットパターンの対応は種々雑多である.

68000の命令語は,基本的には1ワードである. ところが,アドレッシングモードの種類によっては,最大5ワードの長さにな ることがある.

スーパバイザモード

スーパバイザモードは,オペレーティングシステム(OS)の実装に必要である.

システム制御命令

システム制御命令には,(1)特権命令群,(2)トラップを起こす命令,及 び (3)ステータスレジスタのユーザバイトを操作する命令群の3種類がある.

スーパバイザコールや割り込み処理からのユーザプログラムの復帰にはRTEを 用いる.

特権命令

ステータスレジスタのシステムバイトを変更すると,割り込みレベルの変更, トレースのON/OFFだけでなく,スーパバイザモードとユーザモードの間 の遷移も起こすことができる. 従って,当然ながら,ステータスレジスタのシステムバイトに影響を与える命 令はすべて特権命令である. それには,MOVE to SR(ステータスレジスタの値の変更),MOVE USP(スーパ バイザモードのとき隠れている側のスタックポインタの操作)などがある.

その他,RESET,RTE,STOP命令が特権命令である. RESETは68000に接続された周辺装置をリセットする命令である(680 00自体はリセットしない).

68000がユーザモードのとき特権命令の実行を試みると,特権違反の例外 が発生し,その命令は実行できない. 従って,ユーザが勝手にCPUを止めたり, スーパバイザモード に遷移すること はできない.

トラップ命令

68000で,ユーザがOSの機能を呼び出す(スーパバイザコール)を行う には,トラップ命令を用いる. トラップには,TRAP,TRAPV,CHKの3つの命令があるが,一般には,TRAPが用 いられる. トラップ命令の実行を試みると,トラップ例外が発生する.

参考,引用文献

下記の文献を参考,引用しました.