2.01k likes | 2.1k Views
ソフトウェアとのインターフェース. アセンブリ言語. MIPS アセンブリ言語による加算 add a, b, c 動作 a= b+c 減算 sub a, b, c 動作 a=b-c. オペランド. アセンブリ言語. MIPS アセンブリ言語による加算 add a, b, c 動作 a= b+c 減算 sub a, b, c 動作 a=b-c. ディスティネーション. オペランド. アセンブリ言語. MIPS アセンブリ言語による加算 add a, b, c 動作 a= b+c 減算 sub a, b, c 動作 a=b-c.
E N D
アセンブリ言語 • MIPS アセンブリ言語による加算 • add a, b, c • 動作 • a=b+c • 減算 • sub a, b, c • 動作 • a=b-c オペランド
アセンブリ言語 • MIPS アセンブリ言語による加算 • add a, b, c • 動作 • a=b+c • 減算 • sub a, b, c • 動作 • a=b-c ディスティネーション オペランド
アセンブリ言語 • MIPS アセンブリ言語による加算 • add a, b, c • 動作 • a=b+c • 減算 • sub a, b, c • 動作 • a=b-c ソース オペランド
Cからアセンブリ言語への変換 • C コード • アセンブリコード a=b+c; d=a-e; add a,b,c sub d,a,e
Cからアセンブリ言語への変換 • C コード • アセンブリコード f=(g+h)-(i+j); add t0,g,h#一時変数t0にg+hを記憶 add t1,i,j#一時変数t1にi+jを記憶 sub f,t0,t1#fにt0ーt1を代入 実際は変数はレジスタに割り当てられる。
op rs rt rd shamt funct R形式命令(復習) • op:命令の種類を表現。オペコード(opcode)と呼ばれる。 • rs:第一ソースオペランドレジスタ。$s0、$s1、…、$s7 • rt:第二ソースオペランドレジスタ。$t0、$t1、…$t7 • rd:ディスティネーションレジスタ。 • shamt:シフト量。 • funct:あるopで表現される命令の機能の区別をする表現。機能コードと呼ばれる。
レジスタの利用 • C コード • アセンブリコード f=(g+h)-(i+j); add $t0,$s1,$s2#一時変数t0にg($s1)+h($s2)を記憶 add $t1,$s3,$s4#一時変数t1にi($s3)+j(S4)を記憶 sub $s0,$t0,$t1#f($s0)に$t0ー$t1を代入
メモリにある値をオペランドとした演算 • C コード • アセンブリコード g=h+A[8]; lw$t0,8($s3) add $s1,$s2,$t0 #h は$s2に格納 lw:1ワードをロードする命令 この場合、8+$s3のアドレスをロードする 今の例では32bitを考えているので1wordは32bit
lw メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 0 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 7 A[0] h 0 s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
lw メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 0 0 0 PC s0 s4 命令 デコーダ lw$t0,8($s3) 0 0 s1 s5 7 A[0] h 0 s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
lw メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 0 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 7 A[0] h 0 s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
lw メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 0 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 7 A[0] h A[8] s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
add メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 1 0 0 PC s0 s4 命令 デコーダ add $s1,$s2,$t0 0 0 s1 s5 7 A[0] h A[8] s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
add メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 1 0 0 PC s0 s4 命令 デコーダ add $s1,$s2,$t0 h+A[8] 0 s1 s5 7 A[0] h A[8] s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
lw メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 0 0 0 PC s0 s4 命令 デコーダ lw$t0,8($s3) 0 0 s1 s5 7 A[0] h 0 s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8] ベースレジスタ オフセット
メモリのアドレス • 通常、多くのアーキテクチャではbyteつまり8bitを単位としてアドレスを表現する。 • 今までの図はワードアドレスとしては正しいがバイトアドレスとしては正しくない。MIPS32を仮定すると1word=32bit=4byte • 先のアセンブリコードは本来以下のようになる。 • プログラムカウンタもバイトアドレス表現の場合は4ずつ増える。 lw$t0,32($s3) add $s1,$s2,$t0 #h は$s2に格納
バイトアドレス メモリ 3 0 メモリバス PC r0 r4 命令 デコーダ r1 r5 31 28 r2 r6 制御処理 r3 r7 ALU 演算処理 63 60
ロードとストアが使用されるコード • C コード • アセンブリコード A[0]=h+A[8]; lw$t0,32($s3) add $t0,$s2,$t0 #h は$s2に格納 sw$t0,0($s3)
lw メモリ メモリバス 3 lw$t0,32($s3) 0 add $t0,$s2,$t0 sw$t0,0($s3) 0 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 31 28 A[0] h 0 s2 t0 制御処理 A[1] A[2] 28 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 60 63 A[8]
lw メモリ メモリバス 3 lw$t0,32($s3) 0 add $t0,$s2,$t0 sw$t0,0($s3) 0 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 31 28 A[0] h A[8] s2 t0 制御処理 A[1] A[2] 28 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 60 63 A[8]
add メモリ メモリバス 3 lw$t0,32($s3) 0 add $t0,$s2,$t0 sw$t0,0($s3) 4 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 31 28 A[0] h A[8] s2 t0 制御処理 A[1] A[2] 28 0 s3 t1 A[3] A[4] + A[5] ALU A[6] A[7] 演算処理 60 63 A[8]
add メモリ メモリバス 3 lw$t0,32($s3) 0 add $t0,$s2,$t0 sw$t0,0($s3) 4 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 31 28 A[0] h h+A[8] s2 t0 制御処理 A[1] A[2] 28 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 60 63 A[8]
sw メモリ メモリバス 3 lw$t0,32($s3) 0 add $t0,$s2,$t0 sw$t0,0($s3) 8 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 31 28 A[0] h h+A[8] s2 t0 制御処理 A[1] A[2] 28 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 60 63 A[8]
sw メモリ メモリバス 3 lw$t0,32($s3) 0 add $t0,$s2,$t0 sw$t0,0($s3) 8 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 31 28 h+A[8] h h+A[8] s2 t0 制御処理 A[1] A[2] 28 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 60 63 A[8]
条件判定(if-then-else) • C コード • アセンブリコード if(i==j) f=g+h;else f=g-h; bne $s3,$s4,Else #iと j が等しくなければ Else add $s0,$s1,$s2 j Exit #Exit へジャンプ Else: sub $s0,$s1,$s2 Exit:
If-then-else (i==j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 0 0 0 PC s0 s4 命令 デコーダ 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 0 0 s3 t1 ALU 演算処理 60 63
If-then-else (i==j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 0 0 0 PC s0 s4 命令 デコーダ bne 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 0 0 s3 t1 ALU 演算処理 60 63
If-then-else (i==j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 4 0 0 PC s0 s4 命令 デコーダ 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 0 0 s3 t1 ALU 演算処理 60 63
If-then-else (i==j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 4 0 0 PC s0 s4 命令 デコーダ add 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 0 0 s3 t1 + ALU 演算処理 60 63
If-then-else (i==j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 4 3 0 PC s0 s4 命令 デコーダ 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 0 0 s3 t1 ALU 演算処理 60 63
If-then-else (i==j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 8 3 0 PC s0 s4 命令 デコーダ 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 0 0 s3 t1 ALU 演算処理 60 63
If-then-else (i==j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 16 3 0 PC s0 s4 命令 デコーダ J 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 0 0 s3 t1 ALU 演算処理 60 63
If-then-else (i==j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 16 3 0 PC s0 s4 命令 デコーダ 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 0 0 s3 t1 ALU 演算処理 60 63
If-then-else (i!=j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 0 0 0 PC s0 s4 命令 デコーダ 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 1 0 s3 t1 ALU 演算処理 60 63
If-then-else (i!=j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 0 0 0 PC s0 s4 命令 デコーダ bne 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 1 0 s3 t1 ALU 演算処理 60 63
If-then-else (i!=j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 12 0 0 PC s0 s4 命令 デコーダ bne 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 1 0 s3 t1 ALU 演算処理 60 63
If-then-else (i!=j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 12 0 0 PC s0 s4 命令 デコーダ 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 1 0 s3 t1 ALU 演算処理 60 63
If-then-else (i!=j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 12 0 0 PC s0 s4 命令 デコーダ sub 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 1 0 s3 t1 - ALU 演算処理 60 63
If-then-else (i!=j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 12 -1 0 PC s0 s4 命令 デコーダ 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 1 0 s3 t1 ALU 演算処理 60 63
If-then-else (i!=j) メモリ メモリバス 3 bne $s3,$s4,12 0 add $s0,$s1,$s2 J 16 sub $s0,$s1,$s2 16 -1 0 PC s0 s4 命令 デコーダ 1 0 s1 s5 31 28 2 0 s2 t0 制御処理 1 0 s3 t1 ALU 演算処理 60 63
条件判定(while) • C コード • アセンブリコード while(A[i]!=k) i+=1; Loop:sll $t1,$s3,2 #$3を2ビットシフト=i*4 add $t1,$t1,$s6 #ベースアドレス加算 lw $t0,0($t1)#A[i]をロード beq$t0,$s5,Exit#A[i] と k の比較 addi $s3,$s3,1 j Loop Exit:
while メモリ メモリバス 3 sll $t1,$s3,2 0 add $t1,$t1,$s6 lw$t0,0($t1) beq$t0,$s5,24 0 0 0 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 2 40 s2 s6 制御処理 0 0 s3 s7 A[0]=0 A[1]=1 0 0 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 60 63 演算処理
while メモリ メモリバス 3 sll $t1,$s3,2 0 add $t1,$t1,$s6 lw$t0,0($t1) beq$t0,$s5,24 0 0 0 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 2 40 s2 s6 制御処理 0 0 s3 s7 A[0]=0 A[1]=1 0 0 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 60 63 演算処理
while メモリ メモリバス 3 sll $t1,$s3,2 0 add $t1,$t1,$s6 lw$t0,0($t1) beq$t0,$s5,24 0 0 0 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ sll 1 3 s1 s5 31 28 2 40 s2 s6 制御処理 0 0 s3 s7 A[0]=0 A[1]=1 0 0 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 60 63 演算処理
while メモリ メモリバス 3 sll $t1,$s3,2 0 add $t1,$t1,$s6 lw$t0,0($t1) beq$t0,$s5,24 4 0 0 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 2 40 s2 s6 制御処理 0 0 s3 s7 A[0]=0 A[1]=1 0 0 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 60 63 演算処理
while メモリ メモリバス 3 sll $t1,$s3,2 0 add $t1,$t1,$s6 lw$t0,0($t1) beq$t0,$s5,24 4 0 0 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ add 1 3 s1 s5 31 28 2 40 s2 s6 制御処理 0 0 s3 s7 A[0]=0 A[1]=1 0 0 t0 t1 A[2]=2 A[3]=3 + ALU A[4]=4 60 63 演算処理
while メモリ メモリバス 3 sll $t1,$s3,2 0 add $t1,$t1,$s6 lw$t0,0($t1) beq$t0,$s5,24 4 0 0 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 2 40 s2 s6 制御処理 0 0 s3 s7 A[0]=0 A[1]=1 0 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 60 63 演算処理
while メモリ メモリバス 3 sll $t1,$s3,2 0 add $t1,$t1,$s6 lw$t0,0($t1) beq$t0,$s5,24 8 0 0 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ 1 3 s1 s5 31 28 2 40 s2 s6 制御処理 0 0 s3 s7 A[0]=0 A[1]=1 0 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 60 63 演算処理
while メモリ メモリバス 3 sll $t1,$s3,2 0 add $t1,$t1,$s6 lw$t0,0($t1) beq$t0,$s5,24 8 0 0 PC s0 s4 addi $s3,$s3,1 j 0 命令 デコーダ lw 1 3 s1 s5 31 28 2 40 s2 s6 制御処理 0 0 s3 s7 A[0]=0 A[1]=1 0 40 t0 t1 A[2]=2 A[3]=3 ALU A[4]=4 60 63 演算処理