2006年度 計算機システム演習 第4回 2005年5月19日.

Slides:



Advertisements
Similar presentations
1 B10 CPU を作る 1 日目 解説 TA 高田正法
Advertisements

2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
エクセル(1)の目次 起動法、ブック、シート、セル ブックの開き方 エクセル画面 マウスポインターの種類 シート数の調節 データの入力法
Android と iPhone (仮題) 情報社会とコンピュータ 第13回
プログラミング入門 電卓番外編 ~エクセルで関数表示~.
Win32APIとMFC H107102 古田雅基 H107048 佐藤一樹 H107126 山下洋平.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
情報システム基盤学基礎1 コンピュータアーキテクチャ編 第2回 命令
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
エクセル(1)の目次 起動法、ブック、シート、セル ブックの開き方 エクセル画面 マウスポインターの種類 シート数の調節 データの入力法
2012年度 計算機システム演習 第4回 白幡 晃一.
計算機構成 第7回 サブルーチンコールとスタック テキストp85-90
App. A アセンブラ、リンカ、 SPIMシミュレータ
第4回目 2006/05/08.
ソフトウェアとのインターフェース.
計算機システムⅡ 命令セットアーキテクチャ
2006/12/7 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
プログラムはなぜ動くのか.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
オペレーティングシステム (割り込み処理)
第5回 CPUの役割と仕組み3 割り込み、パイプライン、並列処理
オペレーティングシステム i386アーキテクチャ(2)
基本情報技術概論(第8回) 埼玉大学 理工学研究科 堀山 貴史
第3回目 2006/05/01.
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
型付きアセンブリ言語を用いた安全なカーネル拡張
2012年度 計算機システム演習 第6回 福田 圭祐.
コンパイラの解析 (4) 例外処理.
・ディジタル回路とクロック ・プロセッサアーキテクチャ ・例外処理 ・パイプライン ・ハザード
独習Java ・ 8.1  例外処理 ・ 8.2  catch ブロックの検索  12月 5日    小笠原 一恵.
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
勉強会その3    2016/5/1 10 8分35秒 データの表現 演算.
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
TA 高田正法 B10 CPUを作る 3日目 SPIMの改造 TA 高田正法
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
コンパイラ資料 実行時環境.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
計算機構成 第3回 データパス:計算をするところ テキスト14‐19、29‐35
オペレーティングシステムJ/K 2004年11月15日2時限目
情報工学科 3年生対象 専門科目 システムプログラミング 第4回 シェルスクリプト 情報工学科 篠埜 功.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
情報とコンピュータ 静岡大学工学部 安藤和敏
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 4 回.
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
プログラミングⅡ 第2回.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
コンピュータアーキテクチャ 第 3 回.
プログラミング入門 電卓を作ろう・パートI!!.
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 5 回.
計算機アーキテクチャ1 (計算機構成論(再)) 第二回 命令の種類と形式
コンピュータアーキテクチャ 第 4 回.
第4回 CPUの役割と仕組み2 命令の解析と実行、クロック、レジスタ
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
コンピュータアーキテクチャ 第 3 回.
コンピュータアーキテクチャ 第 5 回.
ca-9. 数の扱い (コンピュータアーキテクチャとプロセッサ)
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
情報システム基盤学基礎1 コンピュータアーキテクチャ編
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
Presentation transcript:

2006年度 計算機システム演習 第4回 2005年5月19日

caller-save (前回の方法) caller-save (呼び出し元で保存) レジスタ $t0〜$t9 foo: addi $sp, $sp, -8 : # $t0に代入   : sw $t0, 4($sp) jal bar lw $t0, 4($sp) # $t0を使った処理 addi $sp, $sp, 8 jr $ra bar: caller-save (呼び出し元で保存) レジスタ $t0〜$t9 データが入っているレジスタはサブルーチンの呼び出し元で待避・復帰 サブルーチン内では $t0〜$t9 を自由に使える

callee-save callee-save (呼び出し先で保存) レジスタ $s0〜$s7 サブルーチンで使うレジスタはサブルーチンの先頭・最後で待避・復帰 呼び出し元では $s0〜$s7 を自由に使える $ra も callee-save foo: jal bar bar: addi $sp, $sp, -4 sw $s0, 0($sp) : # $s0を使った処理 lw $s0, 0($sp) addi $sp, $sp, 4 jr $ra

効率の違い レジスタを退避・復帰する回数が変わる # $xに代入 jal foo jal bar # $xを使って計算 # $xに代入 プログラム caller-save $xはfooの前で退避し、barの後で復帰(1回) $xはfooとbarの前後で保存・復帰(2回) callee-save $xの退避・復帰はfooとbarで使うかどうかに依存(0〜2回) # $xに代入 jal foo jal bar # $xを使って計算 # $xに代入 jal foo # $xを使って計算 jal bar

例外とは? Java の例外 CPU の例外 自分で書いた catch 文の中の処理が行われる OSカーネル内で用意された処理が行われる プログラム 例外発生 try { : } catch (Exception e) { 例外処理 } 例外発生 例外処理 OSカーネル

例外の種類 プログラムの不正実行で発生するもの プログラムから明示的に発生させるもの 不正アドレスのアクセス 例: lw $t0, 0x00000001 Exception 4 [Address error in inst/data fetch] プログラムから明示的に発生させるもの OSカーネルでしか使えない 機能を利用するため ファイル入出力など サブルーチンに似ているが サブルーチンでは呼べない 例外番号 内容 8 syscall 例外 13 トラップ例外

例外処理の流れ 例外ハンドラ アドレス 0x80000180 から実行される $k0, $k1 レジスタが使える .kdata : プログラム 例外ハンドラ アドレス 0x80000180 から実行される $k0, $k1 レジスタが使える : li $v0, 5 syscall move $t0, $v0 例外発生 復帰 .kdata : .ktext 0x80000180 例外ハンドラ read_int の処理 OSカーネル

レジスタの保存 例外ハンドラ内で使うレジスタを保存 例外処理がプログラムの実行に悪影響を与えないようにする callee-save .kdata save_t0: .word 0  # $t0を保存するメモリ領域 .ktext 0x80000180 .set noat  # $atを扱うことを許可する move $k1, $at  # 疑似命令が使うレジスタを$k1に保存 .set at  # $atを扱うことを不許可にする sw $t0, save_t0 # $t0を使うなら元の値を保存

疑似命令(再) MIPS にはない命令 命令自体はあるがオペランドが違う命令 blt, bge, ... sw $t0, A($t0) lui $at, 4097 addu $at, $at, $t0 sw $t1, 0($at) ここで例外が発生して $at が 上書きされると困る $at レジスタを使って実現

コプロセッサ メインプロセッサとは別のプロセッサが例外を管理する コプロセッサのレジスタには mfc0, mtc0 命令でアクセスできる 例外番号など コプロセッサのレジスタには mfc0, mtc0 命令でアクセスできる mfc0 CPUレジスタ, コプロセッサレジスタ コプロセッサのレジスタの内容をCPUレジスタにコピー mtc0 CPUレジスタ, コプロセッサレジスタ CPUレジスタの内容をコプロセッサのレジスタにコピー

例外の種類の判定 コプロセッサの Cause レジスタに発生した例外番号が入っている $13 レジスタ mfc0 $k0, $13 例外コード mfc0 $k0, $13 srl $k0, $k0, 2 # 2ビット右シフト andi $k0, $k0, 0x1f # 下位5ビットを取り出す

実際の例外処理 例外に応じた処理をする 不正メモリアクセス syscall エラーを表示 プログラムを終了 $v0 で指定されたサービスを実行 $a0〜$a3を引数とする $v0 に結果を代入

PC の調整 次の命令から実行再開 EPC(Exception Program Counter)レジスタに例外が発生した命令のアドレスが入っている コプロセッサの $14 レジスタ EPC の値を 4 増やせば次の命令から再開できる mfc0 $k0, $14 addiu $k0, $k0, 4 mtc0 $k0, $14

レジスタの復帰と例外ハンドラ終了 例外発生時と全てのレジスタの内容を同じにしておく必要がある syscall の場合は $v0 だけ変わる eret 命令で EPC レジスタが指すアドレスから実行を再開 lw $t0, save_t0 # $t0を復帰 .set noat # $atを扱うことを許可 move $at, $k1 # $atを復帰 .set at eret

SPIM での例外ハンドラ デフォルトで /usr/local/share/exceptions.s が使われている 変更するには -exception_file オプションをつけて xspim を起動すればよい 例: xspim -exception_file myexceptions.s Loaded: myexceptions.s と表示される

スタートアップルーチン myexceptions.s には main ルーチンを呼び出す初期ルーチンも書かなければならない .text .globl __start __start: jal main # mainを呼び出す li $v0, 10 syscall # exitシステムコール

課題1(〆切:6月4日(日)23時) myexceptions.s を作成し、引数の値を10倍するシステムコールを作れ SPIM では syscall 例外は発生しないので、代わりにトラップ例外を使用する teq $zero, $zero でトラップ例外を発生させられる li $v0, 100 # システムコール番号100 li $a0, 55 # 10倍したい値 teq $zero, $zero # トラップ例外を発生させる move $a0, $v0 li $v0, 1 syscall # 10倍した値を表示 新しいシステムコールを使うプログラム例

課題1のヒント myexceptions.s .kdata : .ktext 0x80000180 # 例外ハンドラで使用するレジスタを退避($atと$t0など) # Causeレジスタから例外番号を取得 # 例外番号が13以外ならdoneにジャンプ # システムコール番号($v0)が100以外ならdoneにジャンプ # 引数($a0)の値を10倍(mul命令)して$v0に代入 done: # EPCレジスタを4進める # 退避したレジスタを復帰 eret __start:

課題2 caller-save で書かれた次ページのコードを callee-save で書き直し、コードの効率を論じよ 0 または 1 を 8 回入力させて 8 ビットの2進数とみなし、それを 10 進数に変換するプログラム 入力1×27 + 入力2×26 + 入力3×25 + 入力4×24 + 入力5×23 + 入力1×22 + 入力7×21 + 入力8×20 結果を2倍しながら入力を足していく $s0〜$s7 の内、サブルーチン内で使わないレジスタを退避する必要はない main ルーチンもサブルーチンであることに注意せよ main で $s0〜$s7 を使うなら、最初と最後で退避・復帰する必要がある

2進10進変換プログラム .text main: addi $sp, $sp, -12 sw $ra, 0($sp) li $t0, 0 # 結果 li $t1, 0 # i=0 loop: sw $t0, 4($sp) sw $t1, 8($sp) jal read1bit lw $t1, 8($sp) lw $t0, 4($sp) sll $t0, $t0, 1 # 2倍 add $t0, $t0, $v0 addi $t1, $t1, 1 blt $t1, 8, loop move $a0, $t0 li $v0, 1 syscall lw $ra, 0($sp) addi $sp, $sp, 12 jr $ra # サブルーチン read1bit: li $v0, 5 syscall # read_int

課題3 (オプション) 乗算を行うサブルーチンを mul 命令を使わずに作成せよ 単純なアルゴリズム(筆算と同じアルゴリズム) 0011 かける数の最下位ビットが1なら かけられる数を結果に足す andi $x, $y, 0x1(最下位ビットを得る) かけられる数を1ビット左シフト sll $x, $x, 1 かける数を1ビット右シフト srl $x, $x, 1 かける数のビット数回繰り返す 0011 × 0110 0000 + 0000 0010010

課題3の難易度 以下の順に難しくなるので、できるところまでやればよい 16ビットの乗算(結果は32ビット) より高速なアルゴリズム 32ビット×32ビット(結果は64ビット) より多いビット数の乗算

注意 ~/Exercise/compsys/04/ で作業すること できるだけ感想も書いて下さい 5/22 は休講です