第11回
機械語とアーキテクチャ
コンピュータは,記号記号記号 で記号ででで 組組組 み組み 立みみ立立 てられ立てられてられてられ ,, 記号,,記号記号記号 ででで動で動 く動動くく 機械く機械機械:「ソフトウェア機械 ソフトウェアソフトウェアソフトウェア」としても理解されなければな らない。ソフトウェアの最も下位レベルのしくみが「(命令セット)アーキテクチャアーキテクチャアーキテクチャ」である。講義では命アーキテクチャ 令符号(機械語)の構成と種類についてまとめる。また,機械語を効率良く実行するために採用されている 技術について紹介する。機械語とアセンブリ言語
機械語
機械語
機械語
機械語
プロセッサの動作を指示する「命令符号」
ビット列としてメインメモリに存在→命令レジスタに読み込む→プロセッサの動作が決定
命令符号を機械語(mmmmachine
achine
achine language
achine
language
language
language)ともいう.
命令符号
命令符号
命令符号
命令符号の
の
の
の構成例
構成例
構成例
構成例
加算などの演算命令の場合,命令符号(機械語)は, Fig.11-1 に示すように構成されている。演算符号
格納場所1
格納場所2
Fig.11-1
演算命令の構成
一般には,演算の対象となるデータの格納場所の指定に制限がある。(例:格納場所1はレジスタのみ, 格納場所2はレジスタとメモリを指定) また,演算の結果も,常に格納場所1に格納する方式の他,格納 場所2も選択できる方式がある。命令符号は命令の実行に必要な情報を整理して表現したものであり,これを基に命令デコーダがプロ
セッサ内部の制御信号を生成する。デコーダのVHDL記述の例は,資料p.11-6に記載されている(リスト
11-1)。
命令
命令
命令
命令セット
セット
セット
セット
命令 命令 命令命令 セットセットセット(instruction setセット instruction setinstruction set) instruction set
プロセッサが持っている一群の命令
プログラマにとって命令セットは「アーキテクチャアーキテクチャアーキテクチャアーキテクチャ」そのものと言える。
命令セットは,機能によって以下のように分割できる.以下の記法では,レジスタやメモリなどのデータの格納場 所がdest,source,count,レジスタがreg,アドレスがaddress,入出力ポートがport でそれぞれ指定されているものと する.これらのアドレスの指定には複数の方法が用意されている(アドレッシング・モード). 1 OP-code Operand 演 算 の 種 類 を 指示する符号 対象となるデータと演算 結 果の 格納 場所 を指 示する符号
命令セットの構成例
a)
算術
算術
算術
算術・
・
・
・演算命令
演算命令
演算命令
演算命令
例)ADD dest , source : dest ← dest + source SUB dest , source : dest ← dest - source AND dest , source : dest ← dest AND source
SHR reg , count : reg をcount で指定されたビットだけ右にシフト SAR reg , count : reg をcount で指定されたビットだけ右に算術シフト
アセンブリ言語の例:ADD R0,R1
・・・R0←R0+R1
C言語だと a += b ;
b)
データ
データ
データ
データ転送命令
転送命令
転送命令
転送命令
例)MOV dest , source : dest ← source
アセンブリ言語の例:MOV R0,R1
・・・R0←R1
C言語だとa = b ;
c)ジャンプ
ジャンプ
ジャンプ
ジャンプ・
・
・
・コール
コール
コール
コール命令
命令
命令
命令
例)JMP address : 無条件ジャンプ.指定された番地にジャンプ J** address : 条件ジャンプ.条件** が成立すると指定番地にジャンプ この条件は演算の結果によって変化する条件フラグレジスタの特定のビット(Table 10-2 参照)で与えられる jz ×××× :演算の結果がゼロならPC に値××××を格納 jn ×××× :演算の結果が負ならPC に値××××を格納 CALL address :サブルーチンコール RET :サブルーチンからの復帰 アセンブリ言語の例:JMP A000・・・A000番地にジャンプ
(実際の動作は,PCにA000を格納)
SUB R0,1 : レジスタR0から1 を減算
JZ A000 : 結果がゼロならA000番地にジャンプ(PC←A000)
C言語だと
k -= 1 ;
if(k==0){ ・・・・
割 割割 割 りりり 込り込込込 みみみ み タイマなどプロセッサの外部からのハードウェア的な要因により,予め定められた処理に分岐する,割り込みと呼 ばれる機能も,実装されている。 スタック スタックスタック スタック 操作操作操作 (操作(((「「「「 付録付録 」付録付録」」 参照」参照参照参照 )))) サブルーチンとのデータの引渡しに使う引数,サブルーチンからの復帰の際の戻り番地,あるいはレジスタ内容の 退避/復帰などで,スタック(stack)というデータ構造を用いる。通常,スタックは,スタック・ポインタと呼ばれ るレジスタ(SPと略記)を用いてメインメモリ上に構築される。スタック操作のための代表的な命令として,以下の 2つがある。(以下は,スタックをメモリ番地の少なくなる方向に伸ばしていく場合の例である。) PUSH :スタックへのデータ格納。SPの内容をデータ長の分だけ減じてからSPの内容をアドレスとするメモリにデー タを書き込む。 2 3 4d)
入出力命令
入出力命令
入出力命令
入出力命令
例)IN reg , port OUT port , reg
e)
プロセッサ
プロセッサ
プロセッサ
プロセッサ制御命令
制御命令
制御命令
制御命令
例)HALT(プロセッサ停止命令),NOP条件
条件
条件
条件フラグレジ
フラグレジ
フラグレジ
フラグレジスタ
スタ
スタ
スタ
命令の結果によって,条件フラグレジスタの内容が変化する.そして,このレジスタの内容は,条件付き分岐命令に影 響を与える.8ビットプロセッサで一般的に使用されている条件フラグをTable 11-1 に示す.Table 11-1 条件フラグの内容の一例
1) フラグ名 符号名の例 条 件 キャリー キャリー キャリー キャリー C 加算時最上位からの桁上げ,減算時最上位への借りが発生するとセット ゼロ ゼロ ゼロ ゼロ Z 演算結果がゼロ,すなわち,すべてのビットがゼロで あるとセット 符号 符号 符号 符号 ,,, 負数,負数負数負数 S,N 演算結果が負数,すなわち,最上位のビットが1であるとセット オーバーフロー オーバーフロー オーバーフロー オーバーフロー V 演算結果が正,負の表現範囲を越えるとセット パリティ パリティ パリティ パリティ P 演算結果のパリティ(1の個数)が偶数であるとセット 補助 補助 補助 補助 キャリーキャリーキャリー ,キャリー,, , ハーフキャリー ハーフキャリー ハーフキャリー ハーフキャリー A, H 加算時第4桁からの桁上げ,減算時第4桁への借りが発生するとセット 減算 減算 減算 減算 N 減算を実行するとセットC
Z
N V P
A
演算の結果によって特定のフラグ・ビットがセットされる
条件の判定などに使う
主要 主要 主要 主要 なななな アドレッシングアドレッシングアドレッシングアドレッシング・・・ モード・モードモード モード アドレッシング・モードにより,最終的にアドレスバスに出力される実効実効実効 アドレス実効アドレスアドレス(アドレス effective address,ea) が変わってくる.主要なものを以下に示す.Table 11-2
プロセッサのアドレス指定方式
1)方
式
指定内容
実効アドレス
レジスタ
レジスタ
レジスタ
レジスタ直接
直接
直接
直接
データ格納レジスタ
指定された番号のレジスタ
即値
即値
即値
即値
データ
命令後の中にデータを埋め込む
絶対
絶対
絶対
絶対
絶対アドレス
絶対アドレスで指定されたメモリ
レジスタ
レジスタ
レジスタ
レジスタ間接
間接
間接
間接
アドレス格納レジスタR
レジスタRの内容((R)と表記)
ベース
ベース
ベース
ベース相対
相対
相対
相対
アドレス格納レジスタB,変位d
(B)+ d
PC
PC
PC
PC 相対
相対
相対
相対
変位 d
(PC)+ d
5付録
スタック スタックスタック スタックとととと ササササ ブルーチンブルーチンブルーチンブルーチン スタック スタック スタック スタックは,Fig.11-2 に示すような構造を持つメモリである.先に格納したデータは後から格納したデータを読み出 してからでないと読みだせない(先入れ後出し,First In Last Out ).スタックへの読み書きは,PUSH とPOP という 動作によって行われる. 図ではデータの格納場所が移動するように描かれているが,実際にはスタックポインタ(SP)というレジスタを用い てメモリ上に構成される(Fig.11-3). スタックポインタの内容はスタックの読み出し/書き込みを行うメモリへのア ドレスになっている.SP を用いたスタックの動作は, PUSH:ⅰ)SP の内容を1語分減らす. ⅱ)SP の指す主メモリに書き込む POP: ⅰ)SP の指す主メモリから読み込む ⅱ)SP の内容を1語分増やす. となっている。 スタック用のメモリには,通常はメインメモリを使うが,PICマイコンのようにスタック専用のメモリを持つプロセッ サもある。 X X X Y X X Y Z Y Y Z Z Y X (a) (b) (c) (d) (e) (f)Fig.11-2
スタックの概念
SP 1FFF 番地 SP 1FFE 番地 B レ シ ゙ ス タの値 メモリ (a) (b)P U S H B 1FFD 番地 B レ シ ゙ ス タの値 C レ シ ゙ ス タの値 SP (c)P U S H C B レ シ ゙ ス タの値 SP 1FFE 番地 D レ シ ゙ ス タプログラム P1 プログラム Q プログラム P2 プログラム Q プログラム P3 プログラム P1 CALL n CALL n プログラム P2 プログラム P3 サブルーチン Q RET (a) (b) n番地
Fig.11-4 サブルーチン
サブルーチン
何度も使われる処理
を行うプログラムをサブルーチン
サブルーチン
サブルーチンにする
サブルーチン
ひとまとめの処理
プログラムのモジュール化の点で有利である.
スタックはサブルーチンの際の 戻戻戻戻 りりりり 番地番地番地の格納と レジスタ番地 レジスタ 内容レジスタレジスタ内容内容内容 のののの 退避退避退避に使われる.Fig.10-4にサブルーチンの ネステ退避 ネステネステネステ ィング ィング ィング ィングの際のスタックポインタとプログラムカウンタの動作を示す.この図では説明を簡単にするためにレジスタのデー タ長を8 ビットとしている. サブルーチンを呼ぶ際にはレジスタ退避などの余分な動作が必要となること( オーバヘッドオーバヘッドオーバヘッド)オーバヘッド に注意しなくてはならな い. m1 CA LL n1 CA LL m1 RET RET m1 n1 ① サブルーチン Q 1 サブルーチン Q 2 (a) SP PC SP PC SP PC SP PC ① ② ③ ④ (b) n0 m0 ② ③ ④ n0 n1 n0 m0 n0 m0 n0 m1 CA LL n1 CA LL m1 RET RET m1 n1 ① サブルーチン Q 1 サブルーチン Q 2 (a) SP SP SP PC PC SP SP SP PC PC SP SP SP PC PC SP SP SP PC PC ① ② ③ ④ (b) n0 m0 ② ③ ④ n0 n1 n0 m0 n0 m0 n0Fig.11-5
サブルーチンのネスティングとスタック
割り込みとトラップ
ある処理プログラムに制御を渡すというサブルーチンコールと似た動作を行うものに 割割割割 りりりり 込込込 み込みみみと トラップトラップトラップトラップがある. 割 割 割 割 りりりり 込込込 み込みみみ 割り込みというのは,外部の要因によってプロセッサがある定められた処理を行う動作のことである.プロセッサ により異なるが,通常はハードウェアにより割り込み動作が始まる. 割り込みの用途は, ◎ 制御用制御用制御用制御用 AD変換などで制御用コンピュータシステムからAD開始を指示するパルスを出す.ADシステムが変換完了する までは時間がかかるが,変換終了を割り込みによりCPUに知らせることでCPU の効率化が図れる. ◎ タスクタスクタスクタスク * 切り替え ある一定時間ごとに割り込みをかけ,タスクを切り替えて,ユーザからは複数のタスクが並行し て働いて見えるようにする. *:タスクについては後で述べる. 割り込みにはマスクによって割り込み禁止が可能な 通常割通常割通常割通常割 りりりり 込込込 み込みみみと,電源障害など緊急の場合の処理のように禁止 できないようになっている マスクマスクマスクマスク 不能割不能割不能割不能割 りりり 込り込込込 みみとがある.割り込みを受け付けるかどうかの制御は 割みみ 割割 り割りりり 込込 み込込みみみ マスクフマスクフマスクフマスクフ リップフロップ リップフロップ リップフロップリップフロップ(Interrupt Mask:IM)で行う. 割り込み動作は, ⅰ)割り込みフリップフロップをセット ⅱ)PC の内容をスタックにプッシュ ⅲ)PC に割り込み処理プログラムの先頭アドレス(割り込みベクタ)を格納という手順で行われる. トラップ トラップトラップ トラップ(ソフトウェア割り込み) 割り込みと良く似た動作を行うものにトラップ(Trap)がある.プログラム中に置かれたTRAP 命令により,割り 込みと同様の動作を行う.ユーザプログラムからOS の用意している入出力などのサブルーチンを呼び出すときな どに使用する. 命令読込み 命令実行 読込み? 割込み 処理動作 YES NO