ソフトウェアとのインターフェース.

Slides:



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

コンパイラ演習 第 6 回 2005/11/17 大山 恵弘 佐藤 秀明. 今回の内容 実マシンコード生成 – アセンブリ生成 (emit.ml) – スタブ、ライブラリとのリンク 末尾呼び出し最適化 – 関数呼び出しからの効率的なリターン (emit.ml) –[ 参考 ]CPS 変換 種々の簡単な拡張.
CPU設計と パイプライン.
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
情報システム基盤学基礎1 コンピュータアーキテクチャ編 第2回 命令
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第2週目
2012年度 計算機システム演習 第4回 白幡 晃一.
ソフトウェアを美味しく 解析する方法 Security Ark
計算機構成 第7回 サブルーチンコールとスタック テキストp85-90
App. A アセンブラ、リンカ、 SPIMシミュレータ
2006年度 計算機システム演習 第4回 2005年5月19日.
第4回目 2006/05/08.
計算機システムⅡ 命令セットアーキテクチャ
第4回放送授業.
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
プログラムはなぜ動くのか.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
Tokuda Lab. NISHIMURA Taichi
2016年度 プログラミングⅠ ~ 内部構造と動作の仕組み(1) ~.
基本情報技術概論(第8回) 埼玉大学 理工学研究科 堀山 貴史
第7回 2006/6/12.
計算機入門I ハードウェア(1) 計算機のハードウェア構成 ~計算機のハードウェアとは何か~
第3回目 2006/05/01.
2012年度 計算機システム演習 第6回 福田 圭祐.
計算機システム 第1回 2006/04/22.
・ディジタル回路とクロック ・プロセッサアーキテクチャ ・例外処理 ・パイプライン ・ハザード
勉強会その1    2016/4/ 分35秒 コンピュータアーキテクチャとは? コンピュータの構成 命令の実行.
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
勉強会その3    2016/5/1 10 8分35秒 データの表現 演算.
計算機システム 第2回 2011/05/02(月) 「コンピュータ・アーキテクチャへのいざない」
アルゴリズムとデータ構造1 2006年6月16日
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
TA 高田正法 B10 CPUを作る 3日目 SPIMの改造 TA 高田正法
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
コンパイラ資料 実行時環境.
計算機構成 第3回 データパス:計算をするところ テキスト14‐19、29‐35
オブジェクト指向プログラミングと開発環境
情報とコンピュータ 静岡大学工学部 安藤和敏
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 4 回.
2013年度 プログラミングⅠ ~ 内部構造と動作の仕組み(2) ~.
2017年度 プログラミングⅠ ~ 内部構造と動作の仕組み(1) ~.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 5 回.
コンパイラ 2012年11月1日
計算機アーキテクチャ1 (計算機構成論(再)) 第二回 命令の種類と形式
アルゴリズムとデータ構造1 2009年6月15日
コンピュータアーキテクチャ 第 4 回.
第4回 CPUの役割と仕組み2 命令の解析と実行、クロック、レジスタ
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
コンピュータアーキテクチャ 第 5 回.
プログラムの開発手順 1.プログラム設計(仕様の決定) 2.コーディング(ソースファイルの作成) 3.アセンブル(オブジェクトファイル
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
アルゴリズムとデータ構造 2010年6月17日
2014年度 プログラミングⅠ ~ 内部構造と動作の仕組み(1) ~.
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
情報システム基盤学基礎1 コンピュータアーキテクチャ編
第10回 関数と再帰.
情報処理Ⅱ 小テスト 2005年2月1日(火).
6.3 インタプリタ (1)インタプリタ(interpreter)とは
6.5 最終コード生成 (1)コードの形式 ①絶対2進コード(AB : absolute binary) 命令後のオペランドが絶対番地指定。
情報システム基盤学基礎1 コンピュータアーキテクチャ編
Presentation transcript:

ソフトウェアとのインターフェース

アセンブリ言語 MIPS アセンブリ言語による加算 動作 減算 add a, b, c a=b+c sub a, b, c a=b-c オペランド

アセンブリ言語 MIPS アセンブリ言語による加算 動作 減算 add a, b, c a=b+c sub a, b, c a=b-c ディスティネーション オペランド

アセンブリ言語 MIPS アセンブリ言語による加算 動作 減算 add a, b, c a=b+c sub a, b, c a=b-c ソース オペランド

Cからアセンブリ言語への変換 C コード アセンブリコード a=b+c; d=a-e; add a,b,c sub d,a,e

Cからアセンブリ言語への変換 C コード アセンブリコード f=(g+h)-(i+j); add t0,g,h#一時変数t0にg+hを記憶 add t1,i,j #一時変数t1にi+jを記憶 sub f,t0,t1#fにt0ーt1を代入 実際は変数はレジスタに割り当てられる。

R形式命令(復習) op:命令の種類を表現。オペコード(opcode)と呼ばれる。 rs rt rd shamt funct R形式命令(復習) op:命令の種類を表現。オペコード(opcode)と呼ばれる。 rs:第一ソースオペランドレジスタ。$s0、$s1、…、$s7 rt:第二ソースオペランドレジスタ。$t0、$t1、…$t7 rd:ディスティネーションレジスタ。 shamt:シフト量。 funct:あるopで表現される命令の機能の区別をする表現。機能コードと呼ばれる。

レジスタの利用 C コード アセンブリコード f=(g+h)-(i+j); add $t0,$s1,$s2#一時変数t0にg($s1)+h($s2)を記憶 add $t1,$s3,$s4#一時変数t1にi($s3)+j(S4)を記憶 sub $s0,$t0,$t1#f($s0)に$t0ー$t1を代入

メモリにある値をオペランドとした演算 C コード アセンブリコード g=h+A[8]; lw $t0,8($s3) add $s1,$s2,$t0 #h は$s2に格納 lw : 1ワードをロードする命令 この場合、8+$s3のアドレスをロードする 今の例では32bitを考えているので1wordは32bit

lw h 7 メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 制御処理 s2 t0 s3 lw $t0,8($s3) add $s1,$s2,$t0 PC s0 s4 命令 デコーダ s1 s5 7 A[0] h 制御処理 s2 t0 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]

lw h 7 メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 s2 t0 制御処理 s3 lw $t0,8($s3) add $s1,$s2,$t0 PC s0 s4 命令 デコーダ lw $t0,8($s3) s1 s5 7 A[0] s2 h t0 制御処理 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]

lw h 7 メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 制御処理 s2 t0 s3 lw $t0,8($s3) add $s1,$s2,$t0 PC s0 s4 命令 デコーダ s1 s5 7 A[0] h 制御処理 s2 t0 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]

lw h A[8] 7 メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 制御処理 s2 lw $t0,8($s3) add $s1,$s2,$t0 PC s0 s4 命令 デコーダ s1 s5 7 A[0] h A[8] 制御処理 s2 t0 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]

add 1 h A[8] 7 メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 s2 t0 lw $t0,8($s3) add $s1,$s2,$t0 1 PC s0 s4 命令 デコーダ add $s1,$s2,$t0 s1 s5 7 A[0] s2 h t0 A[8] 制御処理 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]

add 1 h+A[8] h A[8] 7 メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 lw $t0,8($s3) add $s1,$s2,$t0 1 PC s0 s4 命令 デコーダ add $s1,$s2,$t0 h+A[8] s1 s5 7 A[0] s2 h t0 A[8] 制御処理 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]

lw h 7 ベースレジスタ オフセット メモリ メモリバス lw $t0,8($s3) PC s0 s4 命令 デコーダ s1 s5 7 lw $t0,8($s3) add $s1,$s2,$t0 PC s0 s4 命令 デコーダ lw $t0,8($s3) s1 s5 7 A[0] 制御処理 s2 h t0 A[1] A[2] s3 7 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8] ベースレジスタ オフセット

メモリのアドレス 通常、多くのアーキテクチャではbyteつまり8bitを単位としてアドレスを表現する。 今までの図はワードアドレスとしては正しいがバイトアドレスとしては正しくない。MIPS32を仮定すると1word=32bit=4byte 先のアセンブリコードは本来以下のようになる。 プログラムカウンタもバイトアドレス表現の場合は4ずつ増える。 lw $t0,32($s3) add $s1,$s2,$t0 #h は$s2に格納

バイトアドレス メモリ 3 メモリバス PC r0 r4 命令 デコーダ r1 r5 31 28 制御処理 r2 r6 r3 r7 ALU メモリバス PC r0 r4 命令 デコーダ r1 r5 31 28 制御処理 r2 r6 r3 r7 ALU 演算処理 63 60

ロードとストアが使用されるコード C コード アセンブリコード A[0]=h+A[8]; lw $t0,32($s3) add $t0,$s2,$t0 #h は$s2に格納 sw $t0,0($s3)

lw h 28 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 t0 制御処理 s3 t1 ALU lw $t0,32($s3) add $t0,$s2,$t0  sw $t0,0($s3) PC s0 s4 命令 デコーダ s1 s5 31 A[0] 28 s2 h t0 制御処理 A[1] A[2] s3 28 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 63 A[8] 60

lw h A[8] 28 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 t0 制御処理 s3 t1 lw $t0,32($s3) add $t0,$s2,$t0  sw $t0,0($s3) PC s0 s4 命令 デコーダ s1 s5 31 A[0] 28 s2 h t0 A[8] 制御処理 A[1] A[2] s3 28 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 63 A[8] 60

add 4 h A[8] 28 + メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 s2 t0 lw $t0,32($s3) add $t0,$s2,$t0  sw $t0,0($s3) 4 PC s0 s4 命令 デコーダ s1 s5 31 A[0] 28 h A[8] 制御処理 s2 t0 A[1] A[2] s3 28 t1 A[3] A[4] + A[5] ALU A[6] A[7] 演算処理 63 A[8] 60

add 4 h h+A[8] 28 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 t0 制御処理 lw $t0,32($s3) add $t0,$s2,$t0  sw $t0,0($s3) 4 PC s0 s4 命令 デコーダ s1 s5 31 A[0] 28 s2 h t0 h+A[8] 制御処理 A[1] A[2] s3 28 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 63 A[8] 60

sw 8 h h+A[8] 28 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 t0 制御処理 lw $t0,32($s3) add $t0,$s2,$t0  sw $t0,0($s3) 8 PC s0 s4 命令 デコーダ s1 s5 31 A[0] 28 s2 h t0 h+A[8] 制御処理 A[1] A[2] s3 28 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 63 A[8] 60

sw 8 h h+A[8] 28 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 t0 制御処理 lw $t0,32($s3) add $t0,$s2,$t0  sw $t0,0($s3) 8 PC s0 s4 命令 デコーダ s1 s5 31 h+A[8] 28 s2 h t0 h+A[8] 制御処理 A[1] A[2] s3 28 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 63 A[8] 60

条件判定(if-then-else) C コード アセンブリコード if(i==j) f=g+h;else f=g-h; bne $s3,$s4,Else #i と j が等しくなければ Else add $s0,$s1,$s2 j Exit #Exit へジャンプ Else: sub $s0,$s1,$s2 Exit:

If-then-else (i==j) 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60

If-then-else (i==j) bne 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 PC s0 s4 命令 デコーダ bne 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60

If-then-else (i==j) 4 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 4 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60

If-then-else (i==j) 4 add 1 2 + メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 4 PC s0 s4 命令 デコーダ add 1 s1 s5 31 28 s2 2 制御処理 t0 s3 t1 + ALU 演算処理 63 60

If-then-else (i==j) 4 3 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 4 3 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60

If-then-else (i==j) 8 3 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 8 3 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60

If-then-else (i==j) 16 3 J 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 16 3 PC s0 s4 命令 デコーダ J 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60

If-then-else (i==j) 16 3 1 2 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 16 3 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 t1 ALU 演算処理 63 60

If-then-else (i!=j) 1 2 1 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 1 t1 ALU 演算処理 63 60

If-then-else (i!=j) bne 1 2 1 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 PC s0 s4 命令 デコーダ bne 1 s1 s5 31 28 制御処理 s2 2 t0 s3 1 t1 ALU 演算処理 63 60

If-then-else (i!=j) 12 bne 1 2 1 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 12 PC s0 s4 命令 デコーダ bne 1 s1 s5 31 28 制御処理 s2 2 t0 s3 1 t1 ALU 演算処理 63 60

If-then-else (i!=j) 12 1 2 1 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 12 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 1 t1 ALU 演算処理 63 60

If-then-else (i!=j) 12 sub 1 2 1 - メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 12 PC s0 s4 命令 デコーダ sub 1 s1 s5 31 28 s2 2 制御処理 t0 s3 1 t1 - ALU 演算処理 63 60

If-then-else (i!=j) 12 -1 1 2 1 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 12 -1 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 1 t1 ALU 演算処理 63 60

If-then-else (i!=j) 16 -1 1 2 1 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 bne $s3,$s4,12 add $s0,$s1,$s2  J 16 sub $s0,$s1,$s2 16 -1 PC s0 s4 命令 デコーダ 1 s1 s5 31 28 制御処理 s2 2 t0 s3 1 t1 ALU 演算処理 63 60

条件判定(while) C コード アセンブリコード while(A[i]!=k) i+=1; Loop:sll $t1,$s3,2 #$3を2ビットシフト=i*4 add $t1,$t1,$s6 #ベースアドレス加算 lw $t0,0($t1)#A[i]をロード beq $t0,$s5,Exit#A[i] と k の比較 addi $s3,$s3,1 j Loop Exit:

while 1 3 2 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 s6 s3 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 1 3 2 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 s6 s3 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while sll 1 3 2 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 s2 s6 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ sll 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 s7 A[0]=0 A[1]=1 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 4 1 3 2 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 s6 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 4 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 4 add 1 3 2 40 + メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 4 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ add 1 3 s1 s5 31 28 2 40 制御処理 s2 s6 s3 s7 A[0]=0 A[1]=1 t0 t1 A[2]=2 A[3]=3 + ALU A[4]=4 63 60 演算処理

while 4 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 4 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 8 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 8 lw 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ lw 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 8 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 12 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 12 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 12 beq 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 12 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ beq 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 16 1 3 2 40 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 16 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 16 addi 1 3 2 40 40 + メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 16 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ addi 1 3 s1 s5 31 28 2 40 制御処理 s2 s6 s3 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 + ALU A[4]=4 63 60 演算処理

while 16 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 16 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 20 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 20 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 20 J 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 20 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ J 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while sll 1 3 2 40 1 40 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ sll 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 1 s7 A[0]=0 A[1]=1 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 1 3 2 40 1 4 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 s6 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 4 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 4 1 3 2 40 1 4 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 4 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 4 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 4 add 1 3 2 40 1 4 + メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 4 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ add 1 3 s1 s5 31 28 2 40 制御処理 s2 s6 s3 1 s7 A[0]=0 A[1]=1 4 t0 t1 A[2]=2 A[3]=3 + ALU A[4]=4 63 60 演算処理

while 4 1 3 2 40 1 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 4 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 8 1 3 2 40 1 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 8 lw 1 3 2 40 1 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 制御処理 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ lw 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 1 s7 A[0]=0 A[1]=1 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 8 1 3 2 40 1 1 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 1 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 12 1 3 2 40 1 1 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 12 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 1 s7 A[0]=0 A[1]=1 1 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 8 1 3 2 40 2 2 48 ループ変数(i) アドレス メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 制御処理 s2 2 s6 40 s3 2 s7 A[0]=0 A[1]=1 2 48 t0 t1 A[2]=2 ループ変数(i) A[3]=3 ALU A[4]=4 63 60 演算処理 アドレス

while 8 1 3 2 40 3 3 52 ループ変数(i) アドレス メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 8 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 制御処理 s2 2 s6 40 s3 3 s7 A[0]=0 A[1]=1 3 52 t0 t1 A[2]=2 ループ変数(i) A[3]=3 ALU A[4]=4 63 60 演算処理 アドレス

while 12 1 3 2 40 3 3 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 12 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 3 s7 A[0]=0 A[1]=1 3 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 12 beq 1 3 2 40 3 3 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 12 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ beq 1 3 s1 s5 31 28 2 制御処理 s2 s6 40 s3 3 s7 A[0]=0 A[1]=1 3 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 24 1 3 2 40 3 3 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) bne $t0,$s5,24 24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 3 s7 A[0]=0 A[1]=1 3 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 24 1 3 2 40 3 3 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 28 s2 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) bne $t0,$s5,24 24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 3 s7 A[0]=0 A[1]=1 3 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

while 24 ループから脱出 1 3 2 40 3 3 44 メモリ メモリバス 3 PC s0 s4 命令 デコーダ s1 s5 31 sll $t1,$s3,2 add $t1,$t1,$s6  lw$t0,0($t1) beq $t0,$s5,24 24 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ ループから脱出 1 3 s1 s5 31 28 s2 2 制御処理 s6 40 s3 3 s7 A[0]=0 A[1]=1 3 44 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 63 60 演算処理

関数呼び出し 関数実行の手順 関数からアクセス可能な場所に引数を置く 関数に制御を移す 関数に必要なメモリ資源の確保 処理の実行 呼び出し元からアクセス可能な場所に結果を置く 制御を元に戻す 

関数呼び出し用レジスタ 引数用レジスタ $a0-$a3 返り値用レジスタ $v0-$v1 アドレス退避用レジスタ $ra

関数専用命令 ジャンプ&リンク命令 jal $raにPC+4を退避して指定のアドレスをPCにセットする 関数から戻る時には jr 命令を用いる。 jr $ra;

関数の呼び出し C コード int leaf_example(int g,int h,int i,int j){ int f; f=(g+h)-(i+j); return f }

関数の呼び出し 引数を受け取る $a* 返り値を返す $v* レジスタを関数呼び出し前の状況に戻す スタックに退避

関数の呼び出し アセンブリコード leaf_example: addi $sp,$sp, -12#スタックに3つスペース確保 sw $t1,8($sp) #関数で$t1を使うのであらかじめ退避 sw $t0,4($sp)#同じく$t0を退避 sw $s0,0($sp)#同様 add $t0,$a0,$a1#$a0=g $a1=h add $t1,$a2,$a3#$a2=i $a3=j sub $s0,$t0,$t1 add $v0,$s0,$zero#f を返す$zeroは0

関数の呼び出し アセンブリコード add $t0,$a0,$a1#$a0=g $a1=h add $t1,$a2,$a3#$a2=i $a3=j sub $s0,$t0,$t1 add $v0,$s0,$zero#f を返す$zeroは0 lw $s0, 0($sp) #退避した値の復旧 lw $t0,4($sp) lw $t1,8($sp) addi $sp,$sp,12 #スタックポインタの復旧 jr $ra #呼び出し元に戻る

より多くのレジスタが必要な場合 スタックの利用 スタック:LIFO(Last In First Out)の待ち行列 スタックポインタ$spで指定

プッシュ 1 をプッシュ 2 をプッシュ 高位 アドレス $sp $sp 1 1 $sp 2 低位 アドレス

ポップ 1 をポップ 2 をポップ 高位 アドレス $sp $sp 1 1 $sp 2 低位 アドレス

Func call 68 9 2 3 8 1 7 64 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 68 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra jr $ra ALU 60 演算処理 jal 0

Func call 68 9 2 3 8 1 7 64 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 68 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra jr $ra ALU 60 演算処理 jal 0

Func call 68 9 2 jal 3 8 1 7 64 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 68 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ jal 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 制御処理 a0 t0 8 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra jr $ra ALU 60 演算処理 jal 0

Func call 9 2 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra ALU 60 演算処理 jal 0

Func call 9 2 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra ALU 60 演算処理 jal 0

Func call 9 2 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra ALU 60 演算処理 jal 0

Func call 4 9 2 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 4 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra ALU 60 演算処理

Func call 4 9 2 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 4 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 制御処理 a0 t0 8 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 48 52 56 ALU 7 60 演算処理 jal 0

Func call 8 9 2 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 8 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 48 52 8 56 ALU 7 60 演算処理 jal 0

Func call 12 9 2 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 12 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 48 9 52 8 56 ALU 7 60 演算処理 jal 0

Func call 16 9 2 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 16 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 16 9 2 add 3 8 1 7 52 72 + メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 16 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ add 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 + ALU 7 60 演算処理 jal 0

Func call 16 9 2 3 1 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 16 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 20 9 2 3 1 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 20 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 20 9 2 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 20 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 24 9 2 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 24 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 24 9 2 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 24 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 24 -4 2 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 24 -4 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 28 9 2 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 28 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 28 -4 2 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 28 -4 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 28 -4 2 -4 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 28 -4 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 32 -4 2 -4 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 32 -4 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 32 -4 2 -4 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 32 -4 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 32 9 2 -4 3 1 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 32 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 1 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 36 9 2 -4 3 8 1 5 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 36 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 5 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 40 9 2 -4 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 40 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 44 9 2 -4 3 8 1 7 52 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 44 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 44 9 2 add -4 3 8 1 7 52 72 + メモリ メモリバス PC s0 a2 命令 デコーダ v0 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 44 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ add -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 52 ra 72 jr $ra 9 8 + ALU 7 60 演算処理 jal 0

Func call 44 9 2 -4 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 44 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 48 9 2 -4 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 48 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 48 9 2 -4 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 48 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 48 9 2 jr -4 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 48 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ jr -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 a0 t0 8 制御処理 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 72 9 2 -4 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 72 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra 9 8 ALU 7 60 演算処理 jal 0

Func call 72 9 2 -4 3 8 1 7 64 72 呼び出し元に戻る メモリ メモリバス PC s0 a2 命令 デコーダ メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 72 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ -4 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra 72 jr $ra 9 8 ALU 7 60 呼び出し元に戻る  演算処理 jal 0

関数の呼び出し 退避 復旧 $t0-$t9を復旧しなく 毎回やるとウザイ てもよいことにする sw $t1,8($sp) #関数で$t1を使うのであらかじめ退避 sw $t0,4($sp)#同じく$t0を退避 sw $s0,0($sp)#同様 lw $s0, 0($sp) #退避した値の復旧 lw $t0,4($sp) lw $t1,8($sp) $t0-$t9を復旧しなく てもよいことにする 毎回やるとウザイ

関数の呼び出し アセンブリコード leaf_example: addi $sp,$sp, -4#スタックに1つスペース確保 sw $s0,0($sp)#同様 add $t0,$a0,$a1#$a0=g $a1=h add $t1,$a2,$a3#$a2=i $a3=j sub $s0,$t0,$t1 add $v0,$s0,$zero#f を返す$zeroは0 lw $s0, 0($sp) #退避した値の復旧 addi $sp,$sp,4 #スタックポインタの復旧 jr $ra #呼び出し元に戻る

Func call 68 9 2 3 8 1 7 64 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) 68 9 2 PC s0 a2 add $t0,$a0,$a1 add $t1,$a2,$a3 命令 デコーダ 3 v0 a3 sub $s0,$t0,$t1 add $v0,$s0,$zero 28 8 制御処理 a0 t0 lw $s0, 0($sp) lw $t0, 4($sp) a1 1 t1 7 lw $t1, 8($sp) addi $sp,$sp,12 sp 64 ra jr $ra ALU 60 演算処理 jal 0

Func call 68 9 2 3 8 1 7 64 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 68 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 8 jr $ra a1 1 t1 7 sp 64 ra ALU 60 演算処理 jal 0

Func call 68 9 2 3 8 1 7 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 68 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 8 jr $ra a1 1 t1 7 sp 64 ra 72 ALU 60 演算処理 jal 0

Func call 9 2 3 8 1 7 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 8 jr $ra a1 1 t1 7 sp 60 ra 72 ALU 60 演算処理 jal 0

Func call 4 9 2 3 8 1 7 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 4 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 8 jr $ra a1 1 t1 7 sp 60 ra 72 ALU 9 60 演算処理 jal 0

Func call 8 9 2 3 1 1 7 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 8 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra a1 1 t1 7 sp 60 ra 72 ALU 9 60 演算処理 jal 0

Func call 12 9 2 3 1 1 5 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 12 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 60 ra 72 ALU 9 60 演算処理 jal 0

Func call 16 -4 2 3 1 1 5 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 16 -4 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 60 ra 72 ALU 9 60 演算処理 jal 0

Func call 20 -4 2 -4 3 1 1 5 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 20 -4 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ -4 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,12 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 60 ra 72 ALU 9 60 演算処理 jal 0

Func call 24 9 2 -4 3 1 1 5 60 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 24 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ -4 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,12 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 60 ra 72 ALU 9 60 演算処理 jal 0

Func call 28 9 2 -4 3 1 1 5 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 28 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ -4 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 64 ra 72 ALU 9 60 演算処理 jal 0

Func call 72 9 2 -4 3 1 1 5 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 72 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ -4 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 64 ra 72 ALU 9 60 演算処理 jal 0

Func call 72 9 2 -4 3 1 1 5 64 72 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 72 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ -4 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra a1 1 t1 5 sp 64 ra 72 ALU 9 60 演算処理 jal 0

Func call 68 9 2 3 8 1 7 64 メモリ メモリバス PC s0 a2 命令 デコーダ v0 a3 28 制御処理 メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 68 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 8 jr $ra a1 1 t1 7 sp 64 ra ALU 60 演算処理 jal 0

Func call 72 9 2 -4 3 1 初期状態と比較すると、s0の値は保存されているがt0およびt1の値が変わっている。 1 5 メモリ メモリバス addi $sp,$sp, -4 sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 72 9 2 PC s0 a2 sub $s0,$t0,$t1 add $v0,$s0,$zero 命令 デコーダ -4 3 v0 a3 lw $s0, 0($sp) addi $sp,$sp,4 28 制御処理 a0 t0 1 jr $ra 初期状態と比較すると、s0の値は保存されているがt0およびt1の値が変わっている。 a1 1 t1 5 sp 64 ra 72 ALU 9 60 演算処理 jal 0

関数から関数を呼ぶ場合 $raの保存をどうするか? 引数レジスタは? 返り値レジスタは? 全てスタックに入れる

例:再帰呼び出し 次の関数を考える。 アセンブリコード int fact (int n){ if(n<1) return (1); else return (n*fact(n-1)); } fact: addi $sp,$sp,-8#スタックに2語分スペースを確保 sw $ra,4($sp) #$ra を退避 sw $a0,0($sp) #引数 $a0 を退避 slti $t0,$a0,1 # n<1 かどうかチェック beq $t0,$zero,L1 # n が1以上なら L1 に飛ぶ addi $v0,$zero,1 #戻り値レジスタに1をセット addi $sp,$sp,8 #スタックポインタを戻す #ここに処理が来る場合、$a0 と $ra は変わっていないので #値の復旧は省略。 jr $ra #呼び出し元に制御を移す

例:再帰呼び出し fact: addi $sp,$sp,-8#スタックに2語分スペースを確保 sw $ra,4($sp) #$ra を退避 sw $a0,0($sp) #引数 $a0 を退避 slti $t0,$a0,1 # n<1 かどうかチェック beq $t0,$zero,L1 # n が1以上なら L1 に飛ぶ addi $v0,$zero,1 #戻り値レジスタに1をセット addi $sp,$sp,8 #スタックポインタを戻す #ここに処理が来る場合、$a0 と $ra は変わっていないので #値の復旧は省略。 jr $ra #呼び出し元に制御を移す L1: addi $a0,$a0,-1 # n-1 を計算し引数レジスタにセット jal fact #関数factを呼び出し lw $a0,0($sp) #引数 n を復元 lw $ra,4($sp) #戻りアドレスを復元 mul $v0,$a0,$v0 # n*fact(n-1)を計算 jr $ra #呼び出し元にreturn

例:再帰呼び出し 次の関数を考える。 n=2で呼ぶ場合の動作 int fact (int n){ if(n<1) return (1); else return (n*fact(n-1)); } fact(2){ return(2*fact(1){ return (1*fact(0){ return 1; }) }

再帰呼び出し 68 2 148 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 68 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 演算処理 jal 0

再帰呼び出し 68 2 148 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 68 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 演算処理 jal 0

再帰呼び出し 2 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 演算処理 jal 0

再帰呼び出し 2 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 演算処理 jal 0

再帰呼び出し 4 2 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 4 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 演算処理 jal 0 72

再帰呼び出し 8 2 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 8 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 2 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72

再帰呼び出し 12 2 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 12 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 2 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72

再帰呼び出し 16 2 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 16 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 2 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72

再帰呼び出し 32 2 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 32 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 2 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72

再帰呼び出し 32 1 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 32 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72

再帰呼び出し 36 1 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 36 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72

再帰呼び出し 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72

再帰呼び出し 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72

再帰呼び出し 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 140 2 演算処理 jal 0 72

再帰呼び出し 4 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 4 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 8 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 8 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 12 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 12 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 16 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 16 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 32 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 32 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 1 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 32 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 32 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 36 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 36 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 124 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 制御処理 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 制御処理 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 124 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 4 124 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 a0 t0 制御処理 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 4 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra a0 t0 制御処理 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 124 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 8 124 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 a1 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 8 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 124 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 12 1 124 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 12 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 124 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 16 1 124 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 t0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 16 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 124 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 20 1 1 124 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 20 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 124 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 24 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 24 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 28 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 28 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 40 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 40 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 40 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 a0 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 40 1 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 44 1 1 1 132 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 44 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 132 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 48 1 1 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 48 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 52 1 1 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 52 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 56 1 1 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 56 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 40 1 1 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 40 1 1 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 1 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 40 1 2 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 40 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 44 1 2 1 140 40 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 44 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 40 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 44 1 2 1 140 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 44 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 140 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 48 1 2 1 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 48 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 52 1 2 1 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 52 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 1 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 52 2 2 1 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 52 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 2 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 56 2 2 1 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 56 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 2 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 72 2 2 1 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 72 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 2 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

再帰呼び出し 72 2 2 1 148 72 メモリ メモリバス 76 80 PC s0 a2 命令 v0 a3 100 28 制御処理 addi $sp,$sp, -8 76 sw $ra,4($sp) 80 sw $a0,0($sp) slti $t0,$a0,1 72 PC s0 a2 beq $t0,$zero,32 addi $v0,$zero,1 命令 2 v0 a3 100 addi $sp,$sp,8 28 jr $ra 制御処理 a0 2 t0 1 addi $a0,$a0,-1 jal 0 a1 t1 lw $a0, 0($sp) 120 lw $ra, 4($sp) sp 148 ra 72 addi $sp,$sp,8 mul $v0,$a0,$v0 40 jr $ra 1 ALU 60 40 140 2 演算処理 jal 0 72

MIPS GCC で遊んでみる .file 1 "func.c" .section .mdebug.abi32 .previous .text .align 2 .globl leaf_example .ent leaf_example leaf_example: .frame $fp,16,$31 # vars= 8, regs= 1/0, args= 0, gp= 0 .mask 0x40000000,-8 .fmask 0x00000000,0 .set noreorder .set nomacro addiu $sp,$sp,-16 sw $fp,8($sp) move $fp,$sp sw $4,16($fp) sw $5,20($fp) sw $6,24($fp)

sw $7,28($fp) lw $3,16($fp) lw $2,20($fp) nop addu $4,$3,$2 lw $3,24($fp) lw $2,28($fp) addu $2,$3,$2 subu $2,$4,$2 sw $2,0($fp) lw $2,0($fp) move $sp,$fp lw $fp,8($sp) addiu $sp,$sp,16 j $31 .set macro .set reorder .end leaf_example .size leaf_example, .-leaf_example .ident "GCC: (GNU) 4.1.2"

最適化オプションを 付けた場合 .file 1 "func.c" .section .mdebug.abi32 .previous .text .align 2 .globl leaf_example .ent leaf_example leaf_example: .frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0 .mask 0x00000000,0 .fmask 0x00000000,0 .set noreorder .set nomacro addu $4,$4,$5 addu $2,$6,$7 j $31 subu $2,$4,$2 .set macro .set reorder .end leaf_example .size leaf_example, .-leaf_example .ident "GCC: (GNU) 4.1.2" 最適化オプションを 付けた場合

再帰呼び出し lw $2,32($fp) nop bgtz $2,$L2 li $2,1 # 0x1 sw $2,16($fp) j $L4 addiu $2,$2,-1 move $4,$2 jal fact move $3,$2 mult $3,$2 mflo $4 sw $4,16($fp) 再帰呼び出し .file 1 "recursion.c" .section .mdebug.abi32 .previous .text .align 2 .globl fact .ent fact fact: .frame $fp,32,$31 # vars= 8, regs= 2/0, args= 16, gp= 0 .mask 0xc0000000,-4 .fmask 0x00000000,0 .set noreorder .set nomacro addiu $sp,$sp,-32 sw $31,28($sp) sw $fp,24($sp) move $fp,$sp sw $4,32($fp) $L4: lw $2,16($fp) move $sp,$fp lw $31,28($sp) lw $fp,24($sp) addiu $sp,$sp,32 j $31 nop .set macro .set reorder .end fact .size fact, .-fact .ident "GCC: (GNU) 4.1.2"

最適化オプションを 付けた場合 .file 1 "recursion.c" .section .mdebug.abi32 .previous .text .align 2 .globl fact .ent fact fact: .frame $sp,24,$31 # vars= 0, regs= 2/0, args= 16, gp= 0 .mask 0x80010000,-4 .fmask 0x00000000,0 .set noreorder .set nomacro addiu $sp,$sp,-24 sw $31,20($sp) sw $16,16($sp) bgtz $4,$L2 move $16,$4 j $L4 li $2,1 # 0x1 最適化オプションを 付けた場合 $L2: jal fact addiu $4,$4,-1 mult $16,$2 mflo $2 $L4: lw $31,20($sp) lw $16,16($sp) j $31 addiu $sp,$sp,24 .set macro .set reorder .end fact .size fact, .-fact .ident "GCC: (GNU) 4.1.2"

$fpって何? フレームポインタという 関数内の変数だがレジスタに割り付けられないものの格納に利用(ローカルなスタック) 配列 データ構造

フレームポインタの利用 高位 アドレス $sp=$fp として$sp を復旧 関数呼び出し前 関数呼び出し中 関数呼び出し後 $fp=$sp を保存 $fp $fp $sp $fp $sp 退避された引数レジスタ 退避された戻りアドレス 退避されたレジスタ ローカルな配列とデータ構造 $sp 低位 アドレス

ヒープの利用 動的に確保可能なメモリ領域 malloc や new で確保 $sp スタック 動的データ $gp 静的データ テキストセグメント:MIPSの機械語コード 静的データセグメント:静的変数、定数、配列 テキスト PC 予約済み

アドレシング MIPSで使えるアドレシングモード レジスタアドレシング:オペランドにレジスタを取る ベース相対アドレシング:命令中の定数とレジスタの和によってオペランドのアドレスを指定 即値アドレシング:命令中の定数をオペランドとする PC相対アドレシング:PCと命令中の定数によってアドレスを指定 擬似直接アドレシング:命令中の26ビットとPCの上位ビットを連結したものがアドレス

おわり