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」検索
© Copyright 2024 ExpyDoc