コンピュータアーキテクチャ 第 4 回
SLA とオーバフロー 例:SLA GR5, 1 ・・・ (GR5) = (16384)10 オーバフロー: * 例:SLA GR5, 1 ・・・ (GR5) = (16384)10 ⇒ レジスタ GR5 の値 (16384)10 = #4000 を 2 倍する 16384 × 2 = 32768 は –32768 ~ 32767 の範囲外! ☆ SLA 命令でのオーバフローはいつも OF に反映されるとは限らない ☆ 最後のビットシフトで 1 が消失すれば OF に 1
SLA による負整数の 2 のべき乗倍 SLA GR3, 2 ・・・ (GR3) = -5 ☆ SLA 命令では OF が 1 でもオーバフローが発生したとは限らない
算術右シフト演算命令 SRA GR0, 3 ・・・ (Shift Right Arithmetic) * 最上位の符号ビットはシフトしない レジスタの右側から送り出されたビットの値は消失する OF にはレジスタから最後に送り出されたビットの値を入れる レジスタの左側の空いたビット位置には符号ビットと同じ値 を入れる
SRA による 2 のべき乗割り SRA GR3, 2 ・・・ (GR3) = (16)10
SRA と端数切り捨て(切り上げ) SRA GR2, 2 ・・・ (GR2) = (9)10 レジスタから 1 の値が消失するとき, * 9 ÷ 4 = 2.25 の 0.25 は整数ではない レジスタから 1 の値が消失するとき, 符号ビットの値が 0 なら結果の *が起こり, 符号ビットの値が 1 なら結果の端数切り上げが起こる.
論理左シフト演算命令 SLL GR0, 3 ・・・ (Shift Left Logical) * 実効アドレス値だけ,レジスタの内容を 最上位の符号ビットもシフトする レジスタの左側から送り出されたビットの値は消失する OF にはレジスタから最後に送り出されたビットの値を入れる レジスタの右側の空いたビット位置には 0 を入れる
論理右シフト演算命令 SRL GR0, 3 ・・・ (Shift Right Logical) 実効アドレス値だけ,レジスタの内容を符号ビットも含めて右へシフト 最上位の符号ビットもシフトする レジスタの右側から送り出されたビットの値は消失する OF にはレジスタから最後に送り出されたビットの値を入れる レジスタの左側の空いたビット位置には *を入れる
1 ワードのビット列に含まれる 1 の数を調べる プログラム ← GR1 をカウンタとして初期化 ← 結果を累積保存 * * ← 終了判定 (GR1 = 16 ?)
演習問題 4.1 前出の <プログラム 8 > の開始から終了までに, GR1 およびフラグレジスタの値がどのように変化す るか順番に示せ.ただし,どちらかのレジスタが変 化するごとに示すこと.
演習問題 4.2 算術シフト演算命令実行時のオーバフローと フラグレジスタの OF の関係について述べよ.
演習問題 4.3 レジスタ GR1 が –21804 を格納しているとする.以下の各命令を実行したあとの GR1 の値を,-32768 から 32767 の 10 進数と見なして示せ.またフラグレジスタ (OF, SF, ZF) の値も示せ. SLA GR1, 3 SRA GR1, 3 SLL GR1, 3 SRL GR1, 3
演習問題 4.4 連続する 1 の系列を“1 のラン”という.またその系列の 1 の個数を“1 のランの長さ”という.前出の <プログラム 8 > を基にして,メモリの W 番地に格納された値 #6A7E に含まれる 1 のランの長さの最大値を調べて,メモリのN 番地に書き出すプログラム ROF1 を記述せよ.
演算結果が * に収まらなくなったとき OF が 1 論理加算命令・減算命令 ADDL GR2, #1000 ・・・ (ADD Logical) SUBL GR2, #1000 ・・・ (SUB Logical) 被演算データを とみて加算・減算 * 演算結果が * に収まらなくなったとき OF が 1
論理比較命令 CPL GR2, #1000 ・・・ (ComPare Logical) 被演算データを 符号なし2進数 とみて比較 * にだけ結果が反映される * には結果が反映されない 第1オペランド値が第2オペランド値より * SF が 1, そうでなければ 0 第1オペランド値と第2オペランド値が * ZF が 1, そうでなければ 0 OF はつねに *
ノーオペレーション命令 NOP ・・・ (No OPeration) 1ワード命令 何もしない命令 コンピュータの動作の * を考慮するとき意味あり コンピュータの動作はクロックを基準にした * 何もしないステップを挿入することあり
プログラムの実行終了制御 プログラムの終了時 ・・・ RET 命令によって制御が分岐 どこへ? ⇒ そのアドレスはどこに記憶するのか? ⇒ どこへ? ⇒ そのアドレスはどこに記憶するのか? ⇒ その領域をどうやって知るのか? ⇒ * * * メモリ #1006 番地の RET 命令を実行 分岐先アドレスを スタックポインタが指示
最も簡単なシステム動作環境 プロセッサ外部から内部の値を直接制御可能 任意のアドレスのメモリ領域を外部から直接読み書き可能 専用の * プログラムレジスタ スタックポインタ 任意のアドレスのメモリ領域を外部から直接読み書き可能 専用の * ユーザとコンピュータ内部を媒介する機構 プログラム実行終了制御 例 (1) RET 命令での分岐先 #**** に * ⇒ 無限の繰り返し命令 例 (2) RET 命令での分岐先 #**** に * ⇒ 合図があるまでプロセッサを停止する命令 その間に実行結果を読み出し(レジスタやメモリの値)
OS によるシステム動作環境 OS (Operating System) : プログラム実行終了制御 コンピュータシステム全体を管理 外部とのデータのやり取りの機能などを提供 入出力装置の制御 ユーザプログラムを適切なメモリ領域に自動的に割り付け ユーザプログラム : 実行時にユーザプログラムの先頭番地をプログラムレジスタに渡す プログラム実行終了制御 RET 命令での分岐先 #**** に ⇒ OS に制御を返す SVC 命令 (SuperVisor Call 命令): ユーザプログラムから OS の機能を呼び出す命令 マクロ命令 IN, OUT は SVC 命令を含む命令列に展開される * *
スタック 先入れ後出しの記憶機構 ・・・ メモリ上に設定 領域は自動的に確保される ⇒ スタックポインタ SP がスタックの を記憶する 先入れ後出しの記憶機構 ・・・ メモリ上に設定 領域は自動的に確保される ⇒ スタックポインタ SP がスタックの を記憶する アーキテクチャによっては最上位アドレスのひとつ上を記憶 データを格納するとスタックポインタは上位アドレスへ移動 データを取り出すとスタックポインタは下位アドレスへ移動 * *
スタックの例 * *
スタック操作命令 PUSH adr, x ・・・ (PUSH effective addess) POP r ・・・ (POP up) * *
スタックによる逆ポーランド記法式の計算 *
演習問題 4.5 教科書の <プログラム 10 > の開始から終了まで に GR1 の値がどのように変化するか順番に示せ. ただし,AREA ではじまるメモリ領域には 53-2* の 文字列を入力するものとする.