68000アセンブラの概要
68000のレジスタ
- データレジスタ
データレジスタは,D0からD7までの8本であり, 32ビットの長さがある.
データレジスタは,データの一時格納,計算に便利なように作られている. データレジスタは,32ビットをフルに使うか,下から8ビットあるいは16 ビットに切っても使うことが できる. すなわち,下の8ビットを使ったとき,上の24ビットは変化しない.
- アドレスレジスタ
アドレスレジスタは,A0からA6までの7本であり, 32ビットの長さがある.
アドレスレジスタは,アドレスの値を格納するのに便利に出来ている. アドレスレジスタは,32ビットをフルに使うか,下から16ビットに切って も使うことが できる.(8ビットに切って使うことは出来ない)
アドレスレジスタを「下から16ビットに切って」(オペランドサイズ=ワー ド)のときは,処理は複雑である. 68000は,アドレスレジスタの中身はアドレス値であるとみなす ため, オペランドサイズがワー ドのとき,上の16ビットに対して,符号拡張が行われる. 符号拡張とは, ビット15が0ならばビット16〜31はすべて0, ビット15が1ならばビット16〜31はすべて1という意味である.
以上のように,アドレスレジスタとデータレジスタは,使用上, 明確に区別せねばならない.
メモリアドレスの決定に参与するレジスタは,多くの場合,アドレスレジスタ である. データレジスタには,基本的には,「データレジスタ直接」のアドレッシング モードしかないが, アドレスレジスタには,「アドレスレジスタ直接」,「アドレスレジスタ間接」, 「ポストインクリメント付きアドレスレジスタ間接」, 「プリデクリメント付きアドレスレジスタ間接」, 「ディスプレースメント付きアドレスレジスタ間接」などの,メモリを扱うの に便利な多数のアドレッシングモードが使える.
- スタックポインタ
スタックポインタは,サブルーチンコールや,割り込み発生時に使われる.
スタックポインタ(SP)は,A7と書くこともある.
実は,スタックポインタは2つ存在し,CPUのモードによって自動的に使うべきスタックポインタが切 り替わる. CPUがスーパバイザモードの時はスーパーバイザスタックポインタ(SS P)が使用され, CPUがユーザモードの時はユーザスタックポインタ(US P)が使用される. 従って,スーパバイザモードでのスタック操作は,USPに影響を与えず, ユーザモードでのスタック操作は,SSPに影響を与えない.
- ステータスレジスタ
CPUがスーパバイザモードになっているかユーザモードになっているかの 情報は,ステータスレジスタ(SR)のビット13(Sビット)に書かれてい る. SRの長さは16ビットであり, 上位8ビット(システムバイト)と,下位8ビット(ユーザバイト)に分かれ ている. システムバイトは,CPUの状態を示し,ユーザバイトは命令の実行結果に応 じて変わる.
- プログラムカウンタ
プログラムカウンタ(PC)は,32ビットである.
メモリのアドレッシング
メモリには,1バイトごとにアドレスがついている. 2バイトで1ワードを構成するが, 68000では,1ワードというとき,上位バイトは偶数番地,下位バイトは 奇数番地でなければならない.
命令語や,16ビットデータは,ワード単位であり, 必ず偶数番地から始まっていなければならない. これを間違えると,アドレスエラーが起こり,例外処理が始まる.
68000アセンブラ(スライド資料,演習問題)
ここでは,命令セットの「すべて」を説明することはできない. そこで,ひとつひとつの命令の詳細はマニュアルを見ていただくことにして, ここでは,命令セットのうちいくつかの重要な命令語や,特殊な命令語の説明 (前期のソフトウェア実験を行うのに十分な説明)に絞りたい.
アセンブラ言語の特徴
- 処理内容ごとにアルファベット列を対応
データの転送: move, movea, moveq, ... 足し算: add, adda, addq, ... 引き算: sub, suba, subq, ... など - 人間は,このアルファベット列を記述
- アセンブラでは,アルファベット列と機械語命 令の間に一対一の対応がつく
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の多くの命令は,さまざまな実効アドレスの指定形式(アドレッシ ングモード)をもっている.
最も基本的なアドレッシングモードは, データレジスタまたはアドレスレジスタに対するアドレッシングである.
- データレジスタ直接
データレジスタがオペランドになる.
- アドレスレジスタ直接
アドレスレジスタがオペランドになる.
- アドレスレジスタ間接
アドレスレジスタ間接は,アドレスレジスタが示している値をアド レス値とするメモリをオペランドとするものである.
- ポストインクリメント・プリデクリメント付きアドレスレジスタ間接
ポストインクリメント付きアドレスレジスタ間接,プリデクリメント付きアド レスレジスタ間接は, アドレッシングの方式はアドレスレジ スタ間接と同じだが,それぞれオペランドフェッチの後,前にそれぞれアドレ スレジスタのインクリメント,デクリメントを行う.
インクリメント,デクリメントされる値は,オペランドサイズがバイトか,ワー ドか,ロングワードかによって,それぞれ,1,2,4である. (ただし,スタックポインタを利用するときは例外的に,それぞれ2,2,4である). なぜ,インクリメントがフェッチの後で,デクリメントがフェッチの前かとい うろ スタックを作るときに便利なようにしているからである.
- ディスプレースメント付きアドレスレジスタ間接
ディスプレースメント付きアドレスレジスタ間接では,指定された値とアドレ スレジスタの値を足した値をアドレス値とするメモリをオペランドとする.
- インデックス付きアドレスレジスタ間接
インデックス付きアドレスレジスタ間接では,アドレスレジスタ の値,ユーザが指定したレジスタ(アドレスレジスタでもデータレジスタでも よい)の値,ユーザが指定した値(8ビット)をす べて加 えた値をアドレス値とするメモリをオペランドとする.
- アブソリュートショート・アブソリュートロング
アブソリュートショート・アブソリュートロングでは,オペランドにアドレス 値を直接指定する. アブソリュートショートでは,指定できる値に000000〜007FFF(16)またはFF8000〜 FFFFFF(16)までという制限がある. アブソリュートロングでは,指定できる値に制限はない.
- ディスプレースメント付きプログラムカウンタ相対・インデックス付きプログラムカウンタ相対
- イミディエート
イミディエートでは,オペランドそのものの中に書かれた値をそのまま用いる.
命令語の中身
命令語は,オペコードと,オペランドの組である. オペコードというのは,命令語の種類を表す記号であり, オペランドでは,命令語の処理を行うべき対象を指定する.
多くの場合,オペランドの長さが,バイトか,ワードか,ロングワードであるかと いうことを指定できる.
MOVE命令では, オペコードは上位2ビットであり,その次にオペランドの長さを2ビットで指定す る. 最後に,オペランドを12ビットで指定する. 以上のようにMOVE命令の長さは合計1ワードである.
一方,AND命令やADD命令では,最初の4ビットがオペコードであり,そ の後12ビットでオペランドとその長さを表現する.
以上のように,命令語とそのビットパターンの対応は種々雑多である.
68000の命令語は,基本的には1ワードである. ところが,アドレッシングモードの種類によっては,最大5ワードの長さにな ることがある.
スーパバイザモード
スーパバイザモードは,オペレーティングシステム(OS)の実装に必要である.
- スーパバイザモード
OSの保護を目的とする
- TRAP命令
ユーザプログラムから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が用 いられる. トラップ命令の実行を試みると,トラップ例外が発生する.
参考,引用文献
下記の文献を参考,引用しました.
- 阿刀田央一,鵜沢繁行,五十嵐智,''68000ハードウェア設計'',昭晃堂