jr $ra

App. A
アセンブラ、リンカ、
SPIMシミュレータ
yasu & kanai
• 機械語
– 2進数の命令
• アセンブリ言語
– 機械語をシンボル表記したもの
• アセンブラ
– アセンブリ言語→機械語
コンパイル・アセンブル・リンク
1オブジェクトファイル≒1モジュール
アセンブリ言語
ファイル
アセンブラ
ソースファイル
オブジェクト
ファイル
マクロ
コンパイラ
条件付コンパイル
ソースファイル
内部ラベルの解決
(マクロ)
(条件付アセンブル)
実行ファイル
(機械語)
リンカ
オブジェクト
ファイル
ライブラリ
外部ラベルの解決
再配置(リロケーション)
アセンブリ言語
• 利点
– 読める
– 時間(命令数)に厳しいプログラム
– ある一部のコードの性能改善
• パイプライン処理等によって困難になりつつある
– コンパイラがサポートしていない特殊命令
– (高級言語の)コンパイラが無い(いらない)
• 欠点
– マシンアーキテクチャ依存
– 長い・読みにくい
アセンブラ
シンボル表
シンボル/アドレス
main 0xXXXXXXXX
loop 0xXXXXXXXX
str 0xXXXXXXXX
printf ?????????
• シンボル名とアドレスの解決
• アセンブリ言語の2進命令への翻訳
.text
lw
$a1, 24($sp)
.align 2
jal
printf
.global main
:
アセンブラ指令
main:
.data
(assembler directive)
subu $sp, $sp, 32
.align 0
:
str:
sw
$zero, 28($sp)
.asciiz “The sum ... \n”
loop:
lw
$t6, 28($sp)
external/globalラベル
:
ble
$t0, 100, loop
localラベル
la
$a0, str
前方参照
(forward reference)
back patching
オブジェクトファイル・実行ファイルの
フォーマット
リンク
a.out 形式
オブジェクトファイル
ヘッダ
テキストセグメント
exec header
oh1
oh2
text1
text2
oh3
text1
text segment
data2
データセグメント
リロケーション情報
data segment
data1
text relocations
data relocations
reloc1
reloc2
symb2
symb1
シンボル表
symbol table
text2
data1
data2
reloc3
デバッグ情報
string table
リロケーション
symb3
ローダ
• 実行ファイルをメモリにロードする
• カーネルの機能
• オブジェクトヘッダに従って
– メモリの確保
– メモリにマップ
• 引数や戻り値レジスタ等の設定・準備
メモリ上のプロセス
スタックセグメント
main
func1
プロセス
データ
セグメント
動的データ
静的データ
$fp
$gp
func2
$sp
テキスト
セグメント
予備
スタックフレーム
or
手続き呼び出しフレーム
スタック・LIFO
main
func1
func2
main start
CPU
main:
:
jal func1
:
jr $ra
func1:
:
jal func2
:
jr $ra
func2:
:
jr $ra
PC
$ra = main_ra
$fp = main_fp
$sp = main_sp
main
退避
main_ra
main_fp
main_sp
$fp
$sp
main -> func1
CPU
main:
:
jal func1
:
jr $ra
func1:
:
jal func2
:
jr $ra
func2:
:
jr $ra
func1_ra
$ra = func1_ra
$fp = func1_fp
$sp = func1_sp
main
main_ra
main_fp
main_sp
func1
func1_ra
func1_fp
func1_sp
$fp
$sp
PC
func1 -> func2
CPU
main:
:
jal func1
:
jr $ra
func1:
:
jal func2
:
jr $ra
func2:
:
jr $ra
func1_ra
$ra = func2_ra
$fp = func2_fp
$sp = func2_sp
main
main_ra
main_fp
main_sp
func1
func1_ra
func1_fp
func1_sp
$fp
func2
func2_ra
PC
$sp
func2 -> func1
CPU
main:
:
jal func1
:
jr $ra
func1:
:
jal func2
:
jr $ra
func2:
:
jr $ra
func1_ra
$ra = func2_ra
$fp = func2_fp
$sp = func2_sp
main
main_ra
main_fp
main_sp
func1
func1_ra
func1_fp
func1_sp
$fp
func2
func2_ra
PC
$sp
func1 -> main
CPU
main:
:
jal func1
:
jr $ra
func1:
:
jal func2
:
jr $ra
func2:
:
jr $ra
func1_ra
$ra = func1_ra
$fp = func1_fp
$sp = func1_sp
main
main_ra
main_fp
main_sp
$fp
func1
$sp
PC
main exit
ローダ
$fp
CPU
main:
:
jal func1
:
jr $ra
func1:
:
jal func2
:
jr $ra
func2:
:
jr $ra
$ra = main_ra
$fp = main_fp
$sp = main_sp
PC
main
$sp
コンパイラとレジスタ(gccの場合)
• コンパイラはレジスタの「利用目的」を決める
– 演算結果レジスタ(vレジスタ)
– 引数レジスタ(aレジスタ)
– 一時変数レジスタ(s,tレジスタ)
– カーネル用レジスタ(kレジスタ)
– 特殊レジスタ(gp,sp,fp,ra)
*Zeroレジスタはハードウェア的に0
割り込みの例
コプロセッサ0
Device 1
EPC
レジスタ14
Status
レジスタ12
Cause
レジスタ13
割り込みが起こったアドレス
割り込み許可フラグ
割り込みの原因
レジスタ
・・・・
割り込みハンドラのアドレス
受け取ったデータ
Program
Counter
I/O1 Data
デバイス
コントローラ
I/O1 Control
割り込み
・・・
CPU内部
割り込み
制御部
割り込み許可フラグ
CPU
I/Oアクセスの手法(1/2)
専用のアドレス空間がある場合
アドレスバス
CPU
0x00
Device A
の制御レジスタ
0x02
Device A
0x04
...
Device B
の制御レジスタ
I/Oのアドレス空間
メモリのアドレス空間
「IN」や「OUT」などのI/O制御用の特
殊な命令でのみアクセス可
(ATMEL-AVR等..)
I/Oアクセスの手法(2/2)
Memory Mapped I/O
アドレスバス
CPU
通常のメモリ
操作命令で
操作可能
メモリにデータが
格納されている
Device A
の制御レジスタ
実際にメモリにデー
タが格納されてい
るわけではない特
殊な領域
0xffff0000
0xffff0004
0xffff0008
メモリのアドレス空間
Device A
Device B
の制御レジスタ
SPIMデモ
• MIPSシミュレータ
– http://www.cs.wisc.edu/~larus/spim.html
• サンプルコード
– http://www.mtl.t.utokyo.ac.jp/~mtakada/jikken_b10/
– Googleで「B10 CPU」検索