計算機アーキテクチャ今日の授業の目的...
TRANSCRIPT
計算機アーキテクチャ
2014年 7月14日
電気情報工学科 田島 孝治
第14回 計算機アーキテクチャ 1
第14回 サブルーチンの実現/PCSpimの使い方
授業スケジュール(前期)
※5/5はこどもの日、7/21は海の日のため休講
※授業変更:6/23 1時限→6/20 3時限
2
第14回 計算機アーキテクチャ
回 日付 タイトル
1 4/7 コンピュータ技術の歴史と コンピュータアーキテクチャ
2 4/14 ノイマン型コンピュータ
3 4/21 コンピュータのハードウェア
4 4/28 数と文字の表現
5 5/12 固定小数点数と浮動小数点表現
6 5/19 計算アーキテクチャ(ARU)
7 5/26 計算装置のハードウェア実装
8 6/2 文字コード
9 6/11 中間試験(9:00-9:50)
回 日付 タイトル
10 6/16 主記憶装置とレジスタ
11 6/20 命令実行の流れ
12 6/30 命令形式とアセンブリ言語
13 7/7 命令セットとアドレッシング
14 7/14 サブルーチンの実現
15 7/28 PCSpimによるアセンブリ言語プログラム
8/4 期末試験(日程はほぼ確定)
16 9/29? フォローアップ(日程は仮)
今日の授業の目的
プログラムの実行順を制御する命令の使い方を学ぶ
R形式、I形式につづく最後の形式であるA形式の バイナリの表現をできるようにする
PCSpimの基本的な使い方(プログラムの記述と実行)について学ぶ
第14回 計算機アーキテクチャ
3
分岐命令について理解する J形式の命令ついて理解を深める
PCSpimによるプログラムの基礎を学ぶ
条件分岐命令
ジャンプ命令
メモリ上の特定の番地にプログラムの処理を移す
無条件でジャンプするための命令
リンク付きジャンプ命令
命令実行後、元の位置に戻れるようにジャンプする
関数呼び出しに使う
命令の形式:J形式
命令長はどの形式でも変わらない
第14回 計算機アーキテクチャ
4
op(6bit) アドレス(26bit)
分岐操作 (条件分岐、ジャンプ等)
アドレス
具体的な命令の例(J形式)
J形式の命令
第14回 計算機アーキテクチャ
5
演算命令 命令コード 使用例 意味
ジャンプ j j label 指定した場所へ処理を移す
リンク付き ジャンプ jal jal label
現在の命令の次の命令番地を$raに書き込んでから指定した場所(label)へ処理を移す
J形式の命令は実はこれしかありません
jal命令はjr命令(レジスタを指定してジャンプ)と 組み合わせて使います
ビット列の作り方(J形式)
第14回 計算機アーキテクチャ
6
targetはどんなバイナリデータになるの?
J形式命令のアドレッシング
(疑似)直接アドレッシング
命令番地を直接記入する
なぜ疑似?
J形式のアドレス記入可能ビット数:26 bit
システムのメモリアドレスビット数:32 bit
6ビット分は指定できない!
6ビットは現在のPCの値等を使います
第14回 計算機アーキテクチャ
7
具体的な例 8
メモリ番地 メモリ内容 意味
0x0040002c 0x08100010 j end
・・・・ ・・・ ・・・
0x00400040 0x00400040 jr $ra end:
0 8 1 0 0 0 1 0
0000 1000 0001 0000 0000 0000 0001 0000 op target
ジャンプ先のアドレス
target
0 0 4 0 0 0 4 0
0000 1000 0001 0000 0000 0000 0100 0000
PCの上位4bit 必ず0
例題
次のjal命令をビット列に直せ
第14回 計算機アーキテクチャ
9
メモリ番地 意味
0x0040002c jal printf
・・・・ ・・・
0x0040003c ・・・・ printf:
op target
サブルーチンの作り方
サブルーチンとすべき場所にラベルを付ける
jal命令をつかってサブルーチンを呼び出す
jr $ra 命令を使って元にもどる
第14回 計算機アーキテクチャ
10
main: li $s1,2 li $s2,5 add $s0,$s1,$s2 jal func # call sub fuction j end func: li $s0,5 li $t0,2 add $t1,$s0,$t0 jr $ra # return
サブルーチンコールの注意点
書き換えてはいけないレジスタがある
レジスタを一度上書きすると元にもとに戻せない
$raを書き換えると呼び出し元に戻れない
MIPSのルールで保存すべきレジスタがある
第14回 計算機アーキテクチャ
11
メモリ上に一部のレジスタの値を退避
MIPSのルールで決まった保護すべきレジスタ
$ra
どうやって値を守る?
値の退避と復元方法
スタックポインタを使うと簡単
第14回 計算機アーキテクチャ
12
#Push addi $sp, $sp, -8 # Decrement stack pointer by 8 sw $ra, 0($sp) # Save $ra to stack sw $s0, 4($sp) #Call sub function jal func #Pop lw $s0, 4($sp) lw $ra, 0($sp) addi $sp, $sp, 8 # Increment stack pointer by 8
PC Spimの使い方
第14回 計算機アーキテクチャ 13
簡単なプログラムを実行してみよう
PCSpimの起動
配布したポータブル版のpcspim.exeを実行
初回は設定をするか聞かれる
YESを選択
設定画面
基本的にはそのままでOK
Exceptionを指定
Browse(日本語の場合は「参照」)ボタンを押してから、exceptions.sファイルを選択する
あとはプログラムソースを開くだけ 第14回 計算機アーキテクチャ
14
加算の実験ファイルの実行
起動完了後「add.asm」ファイルを開きましょう
F5キーで実行開始です
最初のPCの値を聞かれます
そのままOKを押せば大丈夫です
第14回 計算機アーキテクチャ
15
PCSpimの画面の意味
第14回 計算機アーキテクチャ
16
レジスタの状態
メモリの状態
システムメッセージ
レジスタの状態について
表現形式はすべて同じ
レジスタの名前 = 現在のレジスタの値
前半は特殊レジスタ
後半は汎用レジスタ(General Registers)
第14回 計算機アーキテクチャ
17
メモリの状態について
メモリは4列に分かれています
1列目:メモリ番地
2列目:メモリの内容(バイナリデータ)
3列目:メモリの内容(少し解釈したもの)
4列目:元のプログラム
第14回 計算機アーキテクチャ
18
① ② ③ ④
ステップ実行
もう少し細かく実行の様子が知りたいときに利用
1行づつプログラムを実行できます
ステップ実行の方法
ファイルを読み込みます
一度実行してしまった場合は再度読み直しが必要
F10キーを押すと1行づつ実行されます
どこからが自分の作ったプログラム?
jal main までは自動で作られた部分です
前のページをよく見ながら確認してください
第14回 計算機アーキテクチャ
19
実行してみよう
加算プログラムをステップ実行し命令の 実行によるレジスタの変化を確認せよ
加算のプログラムは配布します
第14回 計算機アーキテクチャ
20
プログラムの作り方
メモ帳などのテキストエディタがあれば作成可能
プログラム以外にも少し記入しなければならない 内容がある
基本的なフォーマット
第14回 計算機アーキテクチャ
21
# Data Segment .data # Text Setgment .text .globl main main: li $s1,2 (以下はプログラムを書いていく)
データ 記入部
プログラム記入部
演習課題
先々週の結果を確認しよう
プログラムを入力し、動作とバイナリ変換結果を見る
第14回 計算機アーキテクチャ
22
プログラム op rs rt rd shamt funct
add $t3 $s1 $s2
sra $t1 $s1 3
sub $t2 $t1 $s3
add $s3 $t2 $t3
検討課題
次のC言語で書かれたプログラムをMIPS形式に直し動作を確認せよ
第14回 計算機アーキテクチャ
23
c = a + b; d = d + a; ans = c – d + a;
c = a * b; a = a + b; ans = c – (a + b) * b;
レジスタには何を割り当ててもかまわない
(1)
(2)
最終課題
次のプログラムを作成せよ
等比行列の作成
1, 2, 4, 8, …
レジスタを使ってもメモリを使ってもよい
適当なところで止めること
自分の生年、月、日の和を求めよ
積や商なども適当に試してみること
よく出てくる疑問
printfはできないの?
関数のテストは? 第14回 計算機アーキテクチャ
24
来週syscall命令など特殊な形式を紹介します