計算機構成 第7回 サブルーチンコールとスタック テキストp85-90

Slides:



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

天野 コンピュータ基礎  入出力
CPU設計と パイプライン.
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
VLSI設計論第4回 アキュムレータマシンと 仮遅延シミュレーション
第6回 仮想記憶とページング ページング ページ取り出し方式 ページ置き換え方式 中間テスト(40分)
情報システム基盤学基礎1 コンピュータアーキテクチャ編 第2回 命令
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
Ibaraki Univ. Dept of Electrical & Electronic Eng.
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第2週目
コンパイラ 第9回 コード生成 ― スタックマシン ―
2012年度 計算機システム演習 第4回 白幡 晃一.
オリジナルなCPUの開発 指導教授:笠原 宏 05IE063 戸塚 雄太 05IE074 橋本 将平 05IE089 牧野 政道
2006年度 計算機システム演習 第4回 2005年5月19日.
第4回目 2006/05/08.
ソフトウェアとのインターフェース.
コンピュータ工学基礎 パイプラインハザード テキスト9章 115~124
計算機システムⅡ 命令セットアーキテクチャ
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
演算回路 <例題> 問題:1+2=3を計算する アドレス 内容 データ プログラム 10 11 12 ・ 19 1 2 (答え) 20 21
2006/11/02 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
4.2.2 4to1セレクタ.
プログラミング論 II 電卓,逆ポーランド記法電卓
データ構造とアルゴリズム 第13回 スタックとキュー
第4回放送授業.
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
アルゴリズムとデータ構造 第4回 配列によるスタックとキュー.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
第3回目 2006/05/01.
TAL : Typed Assembly Language について
2012年度 計算機システム演習 第6回 福田 圭祐.
勉強会その3    2016/5/1 10 8分35秒 データの表現 演算.
最適化の方法 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第11章.
アルゴリズムとデータ構造1 2006年6月16日
データ構造と アルゴリズム第4回 知能情報学メジャー 和田俊和.
計算機構成 第6回 分岐命令とプログラムの実行 テキスト第5章
サブルーチン呼び出しの メカニズム.
ディジタル回路の設計と CADによるシステム設計
計算機構成 第2回 ALUと組み合わせ回路の記述
コンパイラ資料 実行時環境.
計算機構成 第3回 データパス:計算をするところ テキスト14‐19、29‐35
計算機構成 第4回 アキュムレータマシン テキスト第3章
VLSI設計論第3回 順序回路の記述と論理合成
計算機構成 第8回 POCOの構造とVerilog記述 テキスト第5章-第6章
計算機構成 第11回 マルチサイクルCPU 慶應大学 天野英晴.
計算機構成 第5回 RISCの命令セットアーキテクチャ テキスト第4章
オブジェクト指向プログラミングと開発環境
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
データ構造とアルゴリズム (第3回) 静岡大学工学部 安藤和敏
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 4 回.
計算機アーキテクチャ1 (計算機構成論(再)) 第一回 計算機の歴史、基本構成、動作原理
2013年度 プログラミングⅠ ~ 内部構造と動作の仕組み(2) ~.
コンピュータアーキテクチャ 第 3 回.
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 5 回.
計算機アーキテクチャ1 (計算機構成論(再)) 第二回 命令の種類と形式
コンピュータアーキテクチャ 第 4 回.
第4回 CPUの役割と仕組み2 命令の解析と実行、クロック、レジスタ
コンピュータアーキテクチャ 第 3 回.
コンピュータアーキテクチャ 第 5 回.
プログラムの開発手順 1.プログラム設計(仕様の決定) 2.コーディング(ソースファイルの作成) 3.アセンブル(オブジェクトファイル
コンピュータ工学基礎 マルチサイクル化とパイプライン化 テキスト9章 115~124
X64 函数呼び出し規約 長谷川啓
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
情報システム基盤学基礎1 コンピュータアーキテクチャ編
6.3 インタプリタ (1)インタプリタ(interpreter)とは
6.5 最終コード生成 (1)コードの形式 ①絶対2進コード(AB : absolute binary) 命令後のオペランドが絶対番地指定。
情報システム基盤学基礎1 コンピュータアーキテクチャ編
Presentation transcript:

計算機構成 第7回 サブルーチンコールとスタック テキストp85-90 情報工学科 天野英晴

サブルーチンコール メインルーチン A サブルーチンは呼ばれた所に 戻っていく 違った場所で呼べる ソフトウェアのモジュール化が可能 現在のプログラムでは不可欠 call A return call A サブルーチンコール命令の 実装における選択 →戻り番地(pc+1)を どこにしまうか?

Jump and Link 戻り番地を最大番号のレジスタに保存 JAL X : pc←pc+1+X, r7←pc+1 POCOの場合r7 古典的な手法でマインフレーム時代に使われた Branch and Link命令 RISCで最も良く使われる方式 JAL X : pc←pc+1+X, r7←pc+1 10101 XXXXXXXX 飛ぶ範囲はJMPと同じく11ビット(-1024~1023) 議論1:サブルーチンの入れ子(ネスト)に対応しない 議論2:r7にしまうのは命令の直交性を損ねる(格好わるい)

2乗を計算する例 LDIU r0,#0 LD r1,(r0) MV r2,r1 r1とr2に同じ値をセットする JAL mult end: JMP end // Subroutine Mult r3 ← r1×r2 ここでr2は破壊される mult: LDIU r3,#0 loop: ADD r3,r1 ADDI r2,#-1 BNZ r2, loop JR r7

POCOのサブルーチンコール メインルーチン A リターン命令にはJR r7が利用可能 ここで疑問: サブルーチンの中で別のサブルーチン を呼ぶとr7が壊れて戻れなくなるのでは? その通り! しかし他にも壊れては困るレジスタは あるはず →保存するためにスタックが必要 JAL B? JAL A JR r7 JAL A

スタック データを積む棚 LIFO(Last In First Out)、FILO(First In Last Out)とも呼ばれる push操作でデータを積み pop操作で取り出す LIFO(Last In First Out)、FILO(First In Last Out)とも呼ばれる 演算スタックとは違う(誤解しないで!) 主記憶上にスタック領域が確保される C C push pop B C B A B A A

Bでは r0,r1が 壊れる スタックを使った入れ子構造への対応 メインルーチン B push r0, push r1 A r1 push r0, push r7 r0 r7 JAL B r0 r7 pop r1, pop r0 JAL A r0 JAL C JR r7 pop r7, pop r0 JR r7 Cでは r1,r2が 壊れる JAL A Aでは r0,r7が 壊れる C push r1, push r2 r2 r1 r7 壊れるレジスタをサブルーチンの 入り口でpushして保存し、 出口でpopして復帰 → 呼ぶ方で保存する方法もある r0 pop r2, pop r1 JR r7

スタックの実現(push) r6をスタックポインタとする スタックポインタをマイナスしてからSTする push 0、push 1は ADDI r6,#-1 ST r0,(r6) ST r1,(r6) r1 r0 r6 r1 スタック領域 r0 r6

スタックの実現(pop) スタック領域はメモリの番地の小さい方に伸びる→昔からの習慣 pop操作は、LDしてからスタックポインタを+する。 LD r1(r6) ADDI r6,#1 LD r0,(r6) r1 r6 r1 r0 r0 r6

2乗を計算する例 r2を破壊しないサブルーチンコール r6はメインルーチンで初期化する必要がある // Subroutine Mult r3 ← r1×r2 mult: ADDI r6,#-1 ST r2,(r6) LDIU r3,#0 loop: ADD r3,r1 ADDI r2,#-1 BNZ r2, loop LD r2,(r6) ADDI r6,#1 JR r7

JALを巡る議論 戻り番地を汎用レジスタに格納する方針 ではr7に決めちゃうのはどうなの? どっちみちスタックに汎用レジスタにしまう ならば入れ子になるときには、r7もついでにしまってやれば良い システムスタックを持っていてCall時にこれにしまう方法(IA32などの方法)と比べて劣ってはいない→むしろ不必要なメモリ読み書きが減る ではr7に決めちゃうのはどうなの? 任意のレジスタにしまうことができても意味がない JALはできるだけ遠くに飛びたいのでレジスタのフィールドはないほうが良い 多少の格好の悪さは我慢しよう!

JAL命令のVerilog記述 pcをr7に保存する assign rf_c = ld_op ? ddatin: jal_op ? pc+1: alu_y; assign rwe = ld_op | alu_op…| jal_op; assign cadr = jal_op? 3’b111 : rd; rfile rfile_1(.clk(clk), .a(rf_a), .aadr(rd), .b(rf_b), .badr(rs), .cadr(cadr), .we(rwe); 今までと異なりレジスタファイルのaadr=cadrではなくなる。この二つを分離する必要がある

JALのVerilog記述 飛び方はJMPと同じ always @(posedge clk or negedge rst_n) begin if(!rst_n) pc <= 0; else if ((bez_op & rf_a == 16’b0) | (bnz_op & rf_a != 16’b0) | (bpl_op & ~rf_a[15]) | (bmi_op & rf_a[15])) pc<=pc+{{8imm[7]}},imm}+1; else if (jmp_op| jal_op) pc <= pc +{{5{idatain[10]}},idatain[10:0]}}+1; else if(jr_op) pc <= rf_a; else pc<=pc+1; end

NOP MV rd,rs rd← rs AND rd,rs rd← rd AND rs OR rd,rs rd← rd OR rs 00000------00000 MV rd,rs rd← rs 00000dddsss00001 AND rd,rs rd← rd AND rs 00000dddsss00010 OR rd,rs rd← rd OR rs 00000dddsss00011 SL rd rd← rd<<1 00000ddd---00100 SR rd rd← rd>>1 00000ddd---00101 ADD rd,rs rd← rd + rs 00000dddsss00110 SUB rd,rs rd← rd - rs 00000dddsss00111 ST rd,(ra) (ra)← rd 00000dddaaa01000 LD rd,(ra) rd← (ra) 00000dddaaa01001 JR rd pc ← rd 00000ddd---01010

LDI rd,#X rd← X(符号拡張) LDIU rd,rs rd← X(ゼロ拡張) ADDI rd,#X rd←rd+X(符号拡張) 01000dddXXXXXXXX LDIU rd,rs rd← X(ゼロ拡張) 01001dddXXXXXXXX ADDI rd,#X rd←rd+X(符号拡張) 01100dddXXXXXXXX ADDIU rd,#X rd←rd+X(ゼロ拡張) 01101dddXXXXXXXX LDHI rd,#X rd←{X,0} 01010dddXXXXXXXX BEZ rd,X if(rd=0) pc←pc+X+1 10000dddXXXXXXXX BNZ rd,X if(rd≠0) pc←pc+X+1 10001dddXXXXXXXX BPL rd,X if(rd>=0) pc←pc+X+1 10010dddXXXXXXXX BMI rd,X if(rd<0) pc←pc+X+1 10011dddXXXXXXXX

JMP #X pc←pc+X+1 JAL #X 10100XXXXXXXXXXX pc←pc+X+1, r7←pc+1

演習 1.multを利用して0番地の数の3乗を計算せよ 2.JALR rdは、JAL同様r7に戻り番地をしまってJR同様rdの中身の番地にそのまま飛ぶ命令である。これを実装せよ。 JALR rd 00000ddd---11000