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