坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科 工学部講義 マイクロプロセッサ応用(3) 坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科 はじめに 講義概要 アドレス指定方式 サブルーチン マイクロプロセッサ応用
はじめに 本講義の目的 時間・場所:火曜日 8:30 - 10:00、3-31 ホームページ(坂井分:ダウンロード可能) 教科書・参考書 マイクロプロセッサのハード・ソフトの基本を実践的に学習する 前半:講義 坂井 (ソフトの基本:機械語プログラミング) 三田先生(ハードの基本) 後半:実習 時間・場所:火曜日 8:30 - 10:00、3-31 ホームページ(坂井分:ダウンロード可能) url: http://www.mtl.t.u-tokyo.ac.jp/~sakai/micro/ 教科書・参考書 Patterson and Hennessy: Computer Organization and Design:The Hardware/Software Interface 2nd Ed. (邦訳 「コンピュータの構成と設計」(第2版)日経BP) マイクロプロセッサ応用 東大・坂井
講義の概要と予定(坂井分) 1.マイクロプロセッサのモデルと命令 2.命令とプログラム 3.アドレス指定方式 4.入出力、例外処理等 アドレス指定方式、サブルーチン 4.入出力、例外処理等 5.課題出題 2月15日: 坂井分課題レポート提出期限(仮) マイクロプロセッサ応用 東大・坂井
3.アドレス指定方式 オペランド(operand) アドレス指定方式(addressing) アドレス指定方式の大別 命令の対象 ソースオペランド: 被演算データ デスティネーションオペランド:結果データ アドレス指定方式(addressing) オペランドを特定する方式のこと アドレス指定方式の大別 即値: 「アドレス」でなく「値」でオペランドを指定 アドレス指定 レジスタアドレス指定:直接アドレッシング(のみ) rs, rt, rd:命令のフィールドがレジスタアドレスを表す メモリアドレス指定: 次のスライド マイクロプロセッサ応用 東大・坂井
3.1 メモリアドレス指定 RISCとCISC RISC: メモリアドレス指定方式の種類は少ない 3.1 メモリアドレス指定 RISCとCISC RISC: メモリアドレス指定方式の種類は少ない load/store以外には、メモリの中身をオペランドとすることはない load/storeのアドレス指定 ベース相対モード: address = rs + dpl インデクス相対モード: address = rs + rt (+dplはないのが普通) PC相対モード:address=pc+dpl (分岐命令で用いる) CISC: メモリアドレス指定方式の種類が多い 一般の演算命令がメモリの中身をオペランドとすることができる アドレス指定 直接モード: address = dpl レジスタ間接モード:address = rs ベース相対モード: address = rs + dpl インデクス相対モード: address = rs+rt+dpl スケールインデクスモード: address = rs+rt*scl+dpl メモリ間接モード:address= (rs)+dpl 自動インクリメントモード:address = rs++ + dpl etc. マイクロプロセッサ応用 東大・坂井
アドレス指定方式の図解 OP rs rt dpl OP rs rt dpl + PC (a)直接モード (d)PC相対モード OP rs * SCL + rs rs (b)ベース相対モード (e)スケールインデクスモード OP rs rt dpl OP rs rt dpl rt + rs rs + (c)インデクス相対モード (b)メモリ間接モード マイクロプロセッサ応用 東大・坂井
3.2 各アドレス指定方式の使い方 ベース相対モード ベース相対モードの用途 3.2 各アドレス指定方式の使い方 ベース相対モード ベース相対モードの用途 ある番地A以後に連続してデータが格納されているときの各データへのアクセス Aをベースアドレスレジスタに入れておいて、各データはここからの変位(相対番地)でアクセスする Base DW 6 DUP #(アドレスBaseを定義する疑似命令) add r2 r0 Base ; r2 <- Base lw r3 0(r2) ; r3 <- x lw r4 4(r2) ; r4 <- y add r3 r3 r4 ; r3 <- r3 + r4 sw r3 8(r2) ; z <- r3 lw r3 12(r2) ; r3 <- u lw r4 16(r2) ; r4 <- v sub r3 r3 r4 ; r3 <- r3 - r4 sw r3 20(r2) ; w <- r3 メモリ ベース アドレス X Y Z U V W マイクロプロセッサ応用 東大・坂井
(注)疑似命令 機械語の命令に対応する命令ではなく、メモリ番地の定義を変数で表すため等に使う見かけ上の命令 X DW X番地に1語データがある DWは一語の領域の定義(Define Word) Y DW 10 DUP Y番地から10語データがある D UPはduplicate (重複)の略 マイクロプロセッサ応用 東大・坂井
各アドレス指定方式の使い方(続き) インデクス相対モード インデクス相対モードの用途 配列データへのアクセスなど 領域の先頭番地Aaをベースアドレスレジスタ、配列の先頭番地(Aからの相対番地)Amをインデクスレジスタに入れておいて、配列要素はここからの変位でアクセスする メモリ X Y A[0] A[1] ‥ A[9] B[0] B[1] B[9] ベース アドレス Base DW 2 DUP A DW 10 DUP B DW 10 DUP add r2 r0 Base ; r2 <- Base mul r3 r1 4 ; r1 = Iとする lw r4 8(r2, r3) ; r4 <- A[I] lw r5 48(r2, r3) ; r5 <- B[I] add r4 r4 r5 ; r4 <- A[I]+B[I] マイクロプロセッサ応用 東大・坂井
3.3 RISC型アドレス指定方式の拡張性 RISC型にないモードの実現 直接モード インデクス相対モード 他のモード 0レジスタ:値が恒常的に0のレジスタ 例.MIPS: r0=0 rs=0レジスタとすれば、直接モードになる インデクス相対モード ベース+インデクスの値を別のレジスタに入れておけばよい 潤沢なレジスタ資源を活用する! 他のモード 複数の命令に展開する スケール: アドレスの入っているレジスタの値を定数倍 RISC型は、アドレス指定方式の種類が少なく、複雑なアドレス指定は命令の組合せで実現する。 よく使うアドレス指定だけを用意し、単純化の利点を活かして高速化することで、全体の処理を高速化する マイクロプロセッサ応用 東大・坂井
3.4 アドレス空間 セグメント化アドレス方式 仮想記憶、記憶保護 語長16ビット以下の計算機 3.4 アドレス空間 セグメント化アドレス方式 語長16ビット以下の計算機 「語 = アドレス」では、アドレス空間が狭い(64KB) → セグメントレジスタを用意し、その中身と16ビットアドレスと足しあわせる 8086:論理空間 1MB 80286: 仮想記憶 → 論理空間 1 GB 80386: 32ビット化 → 論理空間 64TB セグメント 4GB 32ビット全空間をセグメントを切り替えずにアクセスできる (リニアアドレス) 仮想記憶、記憶保護 (田中英彦先生講義) マイクロプロセッサ応用 東大・坂井
4.サブルーチン サブルーチン 一般的な手順(機械語レベル) プログラムの中であるまとまった処理をする部分 レジスタ値の待避 Cの関数、Pascalのprocedure、FORTRANのsubroutine 引数と返値をもつ 一般的な手順(機械語レベル) レジスタ値の待避 戻り番地(次の命令番地)の待避 サブルーチンの先頭番地へのジャンプ サブルーチン本体の実行 戻り番地へのジャンプ レジスタ値の復帰 もとの命令列の実行再開 本方式は、レジスタ値を呼び出し側が待避するので、 Caller Save方式と呼ばれる マイクロプロセッサ応用 東大・坂井
4.1 サブルーチンの実現 スタックを用いる スタック(Stack): Last In First Out (LIFO)型のデータ構造 4.1 サブルーチンの実現 スタックを用いる スタック(Stack): Last In First Out (LIFO)型のデータ構造 通常はメモリの領域を使う スタックポインタ(SP): スタックの一番上を指すレジスタ サブルーチンを呼び出すときは、待避するデータをスタックに積み上げる(PUSH) サブルーチンから復帰するときは、待避したデータをスタックから読み出す(POP) New SP P → Q → Rの順で サブルーチンが呼ばれた とき PUSH POP Q Old SP P SP: Stack Pointer スタック マイクロプロセッサ応用 東大・坂井
4.2 サブルーチンのプログラム sw r1 0(sp) ; レジスタ値の待避(必要なだけ)始め sw r2 4(sp) ....... 4.2 サブルーチンのプログラム sw r1 0(sp) ; レジスタ値の待避(必要なだけ)始め sw r2 4(sp) ....... sw rk 4k(sp) ; レジスタ値の待避終わり add sp 4k+4 call address sub sp 4k+4 lw r1 0(sp) ; レジスタ値の復帰始め lw r2 4(sp) ..... lw rk 4k(sp) ; レジスタ値の復帰終わり もとの仕事の続き ............. body of subroutine ...... ret call: 戻り番地をスタックに積んで、addressへ ジャンプ ret: スタックから戻り番地をPCに戻す address: 注. 戻り番地の待避は特定のレジスタ上にしてもよい。 この場合、ひとつ前の戻り番地をスタックに積む マイクロプロセッサ応用 東大・坂井