210 likes | 522 Views
App. A アセンブラ、リンカ、 SPIM シミュレータ. yasu & kanai. 機械語 2 進数の命令 アセンブリ言語 機械語をシンボル表記したもの アセンブラ アセンブリ言語→機械語. アセンブリ言語 ファイル. 実行ファイル (機械語). オブジェクト ファイル. オブジェクト ファイル. ソースファイル. ソースファイル. コンパイル・アセンブル・リンク. 1オブジェクトファイル≒1モジュール. アセンブラ. (マクロ) (条件付アセンブル). コンパイラ. リンカ. マクロ 条件付コンパイル. ライブラリ.
E N D
App. Aアセンブラ、リンカ、SPIMシミュレータ yasu & kanai
機械語 • 2進数の命令 • アセンブリ言語 • 機械語をシンボル表記したもの • アセンブラ • アセンブリ言語→機械語
アセンブリ言語 ファイル 実行ファイル (機械語) オブジェクト ファイル オブジェクト ファイル ソースファイル ソースファイル コンパイル・アセンブル・リンク 1オブジェクトファイル≒1モジュール アセンブラ (マクロ) (条件付アセンブル) コンパイラ リンカ マクロ 条件付コンパイル ライブラリ 外部ラベルの解決 再配置(リロケーション) 内部ラベルの解決
アセンブリ言語 • 利点 • 読める • 時間(命令数)に厳しいプログラム • ある一部のコードの性能改善 • パイプライン処理等によって困難になりつつある • コンパイラがサポートしていない特殊命令 • (高級言語の)コンパイラが無い(いらない) • 欠点 • マシンアーキテクチャ依存 • 長い・読みにくい
.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” 前方参照 (forward reference) アセンブラ シンボル表 シンボル/アドレス main 0xXXXXXXXX loop 0xXXXXXXXX str 0xXXXXXXXX printf ????????? • シンボル名とアドレスの解決 • アセンブリ言語の2進命令への翻訳 アセンブラ指令 (assembler directive) external/globalラベル localラベル back patching
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 リロケーション
ローダ • 実行ファイルをメモリにロードする • カーネルの機能 • オブジェクトヘッダに従って • メモリの確保 • メモリにマップ • 引数や戻り値レジスタ等の設定・準備
スタックセグメント 動的データ $fp $sp $gp データ セグメント プロセス 静的データ テキスト セグメント 予備 メモリ上のプロセス main func1 func2 スタックフレーム or 手続き呼び出しフレーム
func1 func2 main スタック・LIFO
main_ra main main_fp CPU main_sp $ra = main_ra $fp = main_fp $sp = main_sp 退避 $fp $sp PC main start main: : jal func1 : jr $ra func1: : jal func2 : jr $ra func2: : jr $ra
main func1 CPU $ra = func1_ra $fp = func1_fp $sp = func1_sp $fp $sp func1_ra PC main -> func1 main_ra main_fp main_sp main: : jal func1 : jr $ra func1: : jal func2 : jr $ra func2: : jr $ra func1_ra func1_fp func1_sp
func2 main func1 CPU $ra = func2_ra $fp = func2_fp $sp = func2_sp func2_ra $sp func1_ra PC $fp func1 -> func2 main_ra main_fp main_sp main: : jal func1 : jr $ra func1: : jal func2 : jr $ra func2: : jr $ra func1_ra func1_fp func1_sp
func2 main func1 CPU $ra = func2_ra $fp = func2_fp $sp = func2_sp func2_ra $sp func1_ra PC $fp func2 -> func1 main_ra main_fp main_sp main: : jal func1 : jr $ra func1: : jal func2 : jr $ra func2: : jr $ra func1_ra func1_fp func1_sp
main func1 CPU $ra = func1_ra $fp = func1_fp $sp = func1_sp $fp $sp func1_ra PC func1 -> main main_ra main_fp main_sp main: : jal func1 : jr $ra func1: : jal func2 : jr $ra func2: : jr $ra
main CPU $ra = main_ra $fp = main_fp $sp = main_sp $fp $sp PC main exit ローダ main: : jal func1 : jr $ra func1: : jal func2 : jr $ra func2: : jr $ra
コンパイラとレジスタ(gccの場合) • コンパイラはレジスタの「利用目的」を決める • 演算結果レジスタ(vレジスタ) • 引数レジスタ(aレジスタ) • 一時変数レジスタ(s,tレジスタ) • カーネル用レジスタ(kレジスタ) • 特殊レジスタ(gp,sp,fp,ra) *Zeroレジスタはハードウェア的に0
割り込みの例 コプロセッサ0 割り込みが起こったアドレス レジスタ14 EPC レジスタ12 Status Device 1 割り込み許可フラグ レジスタ13 Cause レジスタ 割り込みの原因 ・・・・ 割り込みハンドラのアドレス Program Counter 受け取ったデータ I/O1 Data デバイス コントローラ I/O1 Control ・・・ CPU内部 割り込み 制御部 割り込み 割り込み許可フラグ CPU
I/Oアクセスの手法(1/2)専用のアドレス空間がある場合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」検索