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

Slides:



Advertisements
Similar presentations
プログラミング演習Ⅱ 第 11 回 ポインタ(2) 情報・知能工学系 山本一公
Advertisements

2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
2012年度 計算機システム演習 第4回 白幡 晃一.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
App. A アセンブラ、リンカ、 SPIMシミュレータ
2006年度 計算機システム演習 第4回 2005年5月19日.
C言語講座 第4回 ポインタ.
情報理論2 第6回 小林 学 湘南工科大学 2011年11月15日 〒 神奈川県藤沢市辻堂西海岸1-1-25
プログラムはなぜ動くのか.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
割り込み.
割り込み.
関数 関数とスタック.
第7回 条件による繰り返し.
2012年度 計算機システム演習 第6回 福田 圭祐.
C言語講座 第3回 ポインタ、配列.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング論 ファイル入出力
第10回関数 Ⅱ (ローカル変数とスコープ).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
アルゴリズムとデータ構造1 2006年6月16日
プログラミング 4 記憶の割り付け.
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
第10章 これはかなり大変な事項!! ~ポインタ~
第7回 条件による繰り返し.
第7回 プログラミングⅡ 第7回
TA 高田正法 B10 CPUを作る 3日目 SPIMの改造 TA 高田正法
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
プログラミング論 ファイル入出力
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
TA 高田正法 B10 CPUを作る   実験の前に TA 高田正法
関数への道.
オブジェクト指向プログラミングと開発環境
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
演習07-0 “Hello\n” “World!\n”と
Cプログラミング演習資料.
C言語 はじめに 2016年 吉田研究室.
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
ポインタとポインタを用いた関数定義.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
コンピュータアーキテクチャ 第 5 回.
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
計算機アーキテクチャ1 (計算機構成論(再)) 第二回 命令の種類と形式
アルゴリズムとデータ構造1 2009年6月15日
コンピュータアーキテクチャ 第 4 回.
ネットワーク・プログラミング Cプログラミングの基礎.
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
精密工学科プログラミング基礎 第7回資料 (11/27実施)
コンピュータアーキテクチャ 第 5 回.
アルゴリズムとデータ構造 2010年6月17日
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
情報システム基盤学基礎1 コンピュータアーキテクチャ編
Cプログラミング演習資料.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
第2章 数値の入力と変数 scanfと変数をやります.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

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

2 はじめに 下のページに目を通すようにしてくださ い。  tokyo.ac.jp/~mtakada/jikken_b10/ tokyo.ac.jp/~mtakada/jikken_b10/  このスライドも上記の場所にあります。

3 今日説明する内容 実験の目的、内容 この実験で扱う道具について  SPIM  MIPS アーキテクチャ 課題 1 ~ 3 を行うために必要な知識  レジスタ  命令  システムコール MIPS 用プログラム記述の例

4 実験の目的 RISC 型プロセッサの構造、動作を理解す る  命令セットを理解する  命令を MIPS シミュレータ ”SPIM” に追加する ことによって、プロセッサの動作に関する理 解を深める

5 実験の内容 MIPS の命令セットを理解する  アセンブラでプログラムを書く 課題 1 ~ 3 プロセッサの動作を理解する  構成図を見て考える 課題 4 ~ 5,8  シミュレータを用いて、命令追加を行う 課題 6 ~ 7  シミュレータと実機の違いについて考える 課題 8

6 SPIM とは? RISC プロセッサ MIPS R2000 のシミュ レータ 以下の機能をサポート  アセンブリ言語からの直接読み込み  プロセッサの状態表示  ステップ実行  簡単な入出力

7 MIPS とは? RISC 型プロセッサの一種  機能が単純な命令のみを持ち、複雑な機能は 命令の組み合わせでサポートする  メモリを扱う命令が、他の命令と分離されて いるのが特徴 32 個の 32bit レジスタを持つ  レジスタ : 計算をするための作業領域

8 メモリとレジスタの違い メモリ  ○ 大きい (2^32Byte など )  ○ アクセスする領域 ( アドレス ) も変数  × 演算命令で直接扱えない  × 遅い レジスタ  ○ 演算命令で直接扱える  ○ 速い  × 小さい (32bit レジスタが 32 個 )  × アクセスする領域 ( レジスタ番号 ) は命令内で明示

9 レジスタの種類 (1) – 汎用レジス タ $t0 ~ $t9  ユーザー用のレジスタ  サブルーチン ( 関数 ) を呼び出す際には、呼び 出す側で値を保存しておく必要がある $s0 ~ $s7  ユーザー用のレジスタ  呼び出されたサブルーチン側で、中身を保存 する必要がある

10 レジスタの種類 (2) – 関数呼び出し 用 $a0 ~ $a3  サブルーチン ( 関数 ) を呼び出す際に、引数を これに入れる $v0 ~ $v1  サブルーチン ( 関数 ) からの戻り値をここに入 れる $ra  サブルーチン ( 関数 ) を呼び出した側の、プロ グラム番地を保存する

11 レジスタの種類 (3) – 特殊なレジス タ $zero  常に 0 が入っているレジスタ $sp  スタックの先頭のアドレスが格納されるレジ スタ

12 レジスタの種類 (4) – 使わないもの 使ってはいけないレジスタ  $at 疑似命令を展開する時に使われるレジスタ ここでいう疑似命令 : ソースファイルに書くことが可能であ るが、実際には複数の実在する命令に展開される命令のこと ( 例 :blt)  $k0 ~ $k1 OS 予約レジスタ 気にしなくて良いレジスタ  $gp, $fp

13 プロセッサの命令の種類 メモリ ←→ レジスタのデータのやり取りをする 命令  いわゆる load/store レジスタを用いて計算をする命令  算術演算、論理演算その他 次に実行する命令を変える命令  条件分岐命令 C 言語の if, for, while などで使われる  無条件ジャンプ命令 C 言語での関数呼び出しなどで使われる

14 lw$t0, 4($t1)  メモリの ($t1 + 4) 番地に書かれている値 (32bit) を、 $t0 レジスタに格納する  $t0 = *($t1 + 1); +1 なのは、 +4 番地 =32bit 向こう =1 要素進んだところだから sw$s2, 0($t0)  $s2 の中身 (32bit) を、メモリの ($t0+0) 番地に格納する  *($t0) = $s2; load/store の例 1Byte 1Word(32bit) x x+1 x+2 x+3 x+4…( 番地 ) 1Word(32bit)

15 演算命令の例 addi$t0, $t1, 1  $t0 = $t1 + 1; or$s0, $s1, $s2  $s0 = $s1 | $s2;

16 制御命令の例 bne$t0, $t1, LABEL  $t0 != $t1 ならば、次からは、 LABEL 番地か ら始まる命令列を実行する  if( $t0 != $t1 ) goto LABEL; jalLABEL  $ra に、 jal 命令の番地 +4 を格納し、次からは LABEL 番地から始まる命令列を実行する  サブルーチン ( 関数 ) 呼び出しに使われる

17 syscall の使い方 SPIM では、キーボードからの入力 / 画面へ の出力を、 syscall を使って行います $v0 にシステムコール番号を入れることに よって、数種類の機能を実現できます 詳しくは、 SPIM マニュアルの 8 ページを 参照してください

18 システムコールの例 $t0( 整数型 ) の中身を画面に表示  li$v0, 1# $v0 = 1;  move$a0, $t0# $a0 = $t0;  syscall メモリの $t0 番地から始まる文字列を表示  li$v0, 4# $v0 = 4;  move$a0, $t0# $a0 = $t0;  syscall プログラムの実行を終了  li$v0, 10  syscall

19 MIPS 用プログラム の記述例

20 具体例 このような関数を考えましょう  num という配列が渡されたときに、先頭 n 要素の和を返す関数 int sum(int n, int num[]){ int sum = 0; int i; for( i = 0; i < n; i++ ){ sum += num[i]; } return sum; }

21 C 言語からアセンブリ言語へ C 言語の変数は、主に 2 種類  static 変数 プログラムのどこからでも見ることのできる変数 コンパイル時に、静的にメモリに割り当てられる  local 変数 同じ関数内でのみ参照可能 実際には以下のいずれかに割り当てます  レジスタ ← ほとんどこちらだけで事足ります  メモリのスタック領域(※坂井先生の資料 8 ページ参照)

22 ソースファイルの書式.data# お約束 ここに、 static 変数に対応する部分を ”.word” 等の疑似命令を使って書く.text# お約束.globlmain# お約束 main:# お約束 ここからプログラムを書く # “#” から行末まではコメントになります

23 for 文の展開 for( i = 0; i < n; i++) をアセンブリ言語で書きま しょう n は、 $a0 に入っていると仮定 i は $t0 に割り当てましょう li$t0, 0# i = 0; loop_start: 何か処理 … addi$t0, $t0, 1# i++ bne$t0, $a0, loop_start# if( i != n ) goto loop_start;

24 メモリからの読み出し $a1 に、先頭の要素のアドレスが入っていると仮定しましょう $t1 に、現在の要素のアドレスを入れましょう $t2 に、各要素の値を一時的に格納しましょう $v0 に、合計の値を格納しましょう li$t0, 0# i =0; li$v0, 0# sum = 0; move$t1, $a1# $t1 = $a1; loop_start: lw$t2, 0($t1)# $t2 = *($t1); add$v0, $v0, $t2# $v0 = $v0 + $t2; addi$t1, $t1, 4# 次の要素は 4 番地 (32bit) 先 addi$t0, $t0, 1# i++; bne$t0, $a0, loop_start# if( I != n ) goto loop_start;

25 関数ができました sum: li$t0, 0# i =0; li$v0, 0# sum = 0; move$t1, $a1# $t1 = $a1; loop_start: lw$t2, 0($t1)# $t2 = *($t1); add$v0, $v0, $t2# $v0 = $v0 + $t2; addi$t1, $t1, 4# 次の要素は 4 番地 (32bit) 先 addi$t0, $t0, 1# i++; bne$t0, $a0, loop_start# if( i != n ) goto loop_start; jr$ra# 関数呼び出し元へ

26 この関数の仕様 配列に入っている各要素の和を計算する  $a0: 要素数  $a1: 先頭のアドレス  $v0: 計算結果

27 呼び出し元を書きましょう こんなプログラムだとしましょう int numOfElements=4;// static 変数 int elements[] = {1, 2, 3, 4};// static 変数 void main(){ int s = sum( numOfElements, elements); printf( “%d”, s); }

28 呼び出し元 main: lw$a0, numOfElements# $a0 = numOfElements; la$a1, elements# $a1 = &(elements[0]); jalsum# $v0 = sum($a0, $a1); move$a0, $v0# $a0 = s; li$v0, 1# syscall# prinf(“%d”, s); li$v0, 10 syscall# exit();

29 static 変数部分 今回は、 numOfElements と elements が static 変数.data numOfElements:.word 4# int numOfElements=4; elements:.word 1, 2, 3, 4# int elements[]={1, 2, 3, 4}; これで、 numOfElements が ”4” の入ったアド レス、 elements が 1, 2, 3, 4 が入ったメモリ の先頭のアドレスを指すようになります

30 完了 tokyo.ac.jp/~mtakada/jikken_b10/ にある sum.s がこのプログラムの完成品です tokyo.ac.jp/~mtakada/jikken_b10/ SPIM で読み込んで、実行してみましょう .word 部分の値を変えて、結果が変わることを 確認してみましょう

31 駆け足になりましたが 各内容についての詳細は以下を参照してくださ い  レジスタの一覧 SPIM マニュアル 10 ページ  命令の一覧 SPIM マニュアル 13 ページ~  システムコールの一覧 SPIM マニュアル 8 ページ~ .data 部分に書くことのできるもの SPIM マニュアル 7 ページ~