MIPSのまとめ (教科書3.7節~3.8節, 4.1節~4.4節) Created by Tsuneo Nakanishi, 2002-2004 レジスタ MIPS のレジスタ レジスタ名 レジスタ番号 用途 関数呼出時のレジスタ破壊 $zero 0 $v0~$v1 2~3 関数の返り値 $a0~$a3 4~7 引数用 $t0~$t7 8~15 一時保存用 $s0~$s7 16~23 変数用 $t8~$t9 24~25 一時保存用 $sp 29 スタックポインタ(後述) 不可 $fp 30 フレームポインタ(後述) 不可 $ra 31 戻り番地 不可 定数値 0,不要な結果の破棄 (NA) 可 不可 可 不可 可 プログラムカウンタ PC: 次に実行する命令の番地を格納.非分岐命令実行ご とに +4 され,また分岐命令実行時に更新される. Created by Tsuneo Nakanishi, 2002-2004 命令形式 命令形式: 命令語のフィールド構成. MIPS は命令語を32bit 幅で統一している. MIPS の命令形式は,R形式,I形式,J形式の3種類がある. どの命令形式かは,op フィールド(命令操作コード)で判別できる. R形式 I形式 J形式 op rs rt rd shamt funct 6bit 5bit 5bit 5bit 5bit 6bit op rs rt address/immediate 6bit 5bit 6bit 16bit op address 6bit 26bit Created by Tsuneo Nakanishi, 2002-2004 加減算命令(1) レジスタ±レジスタ → レジスタ add sub addu subu $○, $△, $□ $○, $△, $□ $○, $△, $□ $○, $△, $□ # $△ + $□ → $○ # $△ – $□ → $○ # $△ + $□ → $○ # $△ – $□ → $○ add/sub 命令は,2の補数表現された符号つき整数の加減算 を行う. addu/subu 命令は,符号なし整数の加減算を行う. add/sub 命令と addu/subu 命令はオーバーフロー発生時の 振る舞いが違う.(計算については同じことを行う.) Created by Tsuneo Nakanishi, 2002-2004 加減算命令(2) op rs rt rd shamt funct 6bit 5bit 5bit 5bit 5bit 6bit op rs rt rd shamt funct add $○, $△, $□ 000000 $△ $□ $○ 00000 100000 addu $○, $△, $□ 000000 $△ $□ $○ 00000 100001 sub $○, $△, $□ 000000 $△ $□ $○ 00000 100010 subu $○, $△, $□ 000000 $△ $□ $○ 00000 100011 R形式 命令 Created by Tsuneo Nakanishi, 2002-2004 加減算命令(3) レジスタ + 定数 → レジスタ addi addiu $○, $△, n $○, $△, n # $△ + n → $○ # $△ + n → $○ 即値オペランド addi/addiu 命令では,定数 n に 16bit の2の補数表現の符号 つき整数(–32768~32767)を指定できる. 定数 n は 32bit に符号拡張されてから加算される. addi 命令と addiu 命令はオーバーフロー発生時の振る舞い が違う.(計算については同じことを行う.) 「subi」「subiu」は存在しない.(∵addi,addiu で代用すればよ い.) Created by Tsuneo Nakanishi, 2002-2004 加減算命令(4) op rs rt address/immediate 6bit 5bit 5bit 16bit op rs rt address/immediate addi $○, $△, n 001000 $△ $○ n addiu $○, $△, n 001001 $△ $○ n I形式 命令 Created by Tsuneo Nakanishi, 2002-2004 加減算命令(5) 例) $s1 に 65539 が格納されているとき, addi $s0, $s1, 13 00000000 00000001 00000000 00000011 $s1: 65539(10) +) 00000000 00000000 00000000 00001001 13(10) 00000000 00000001 00000000 00001100 $s0: 65552(10) addi $s0, $s1, –13 00000000 00000001 00000000 00000011 $s1: 65539(10) +) 11111111 11111111 11111111 11110111 –13(10) 00000000 00000000 11111111 11111010 $s0: 65526(10) Created by Tsuneo Nakanishi, 2002-2004 比較命令(1) レジスタ < レジスタ → レジスタ slt sltu $○, $△, $□ $○, $△, $□ # $△ < $□ → $○ # $△ < $□ → $○ レジスタ < 定数 → レジスタ(定数は 32bit に符号拡張) slti sltiu $○, $△, n $○, $△, n # $△ < n → $○ # $△ < n → $○ slt/slti 命令は,第二オペランドと第三オペランドを 2 の補数表現された符号 つき整数とみなして,比較結果を $○ に書き込む. sltu/sltiu 命令は,第二オペランドと第三オペランドを符号なし整数とみなし て,比較結果を $○ に書き込む. slti/sltiu 命令では,定数 n は 32bit に符号拡張されてから比較される. Created by Tsuneo Nakanishi, 2002-2004 比較命令(2) op rs rt rd shamt funct 6bit 5bit 5bit 5bit 5bit 6bit op rs rt rd shamt funct slt $○, $△, $□ 000000 $△ $□ $○ 00000 101010 sltu $○, $△, $□ 000000 $△ $□ $○ 00000 101011 R形式 命令 Created by Tsuneo Nakanishi, 2002-2004 比較命令(3) op rs rt address/immediate 6bit 5bit 5bit 16bit op rs rt address/immediate slti $○, $△, n 001010 $△ $○ n sltiu $○, $△, n 001011 $△ $○ n I形式 命令 Created by Tsuneo Nakanishi, 2002-2004 論理演算命令(1) ANDゲート: 入力が全て 1 のときのみ出力が 1. A Y B A B Y 0 0 0 0 1 0 1 0 0 1 1 1 AND演算(&): オペランドのビットごとに AND をとる. 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 0 1 0 1 0 0 0 0 0 Created by Tsuneo Nakanishi, 2002-2004 論理演算命令(2) ORゲート: 入力のいずれかが 1 のときのみ出力が 1. A Y B A B Y 0 0 0 0 1 1 1 0 1 1 1 1 OR演算(|): オペランドのビットごとに OR をとる. 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 0 1 1 1 1 1 1 1 0 Created by Tsuneo Nakanishi, 2002-2004 論理演算命令(3) XORゲート: 2つの入力が異なる値のときのみ出力が 1. A Y B A B Y 0 0 0 0 1 1 1 0 1 1 1 0 XOR演算(^): オペランドのビットごとに XOR をとる. 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 1 1 1 0 Created by Tsuneo Nakanishi, 2002-2004 論理演算命令(4) レジスタ and/or レジスタ → レジスタ and or xor $○, $△, $□ $○, $△, $□ $○, $△, $□ # $△ & $□ → $○ # $△ | $□ → $○ # $△ ^ $□ → $○ レジスタ and/or 定数 → レジスタ(定数は 32bit にゼロ拡張) andi ori xori $○, $△, n $○, $△, n $○, $△, n # $△ & n → $○ # $△ | n → $○ # $△ ^ n → $○ Created by Tsuneo Nakanishi, 2002-2004 論理演算命令(5) op rs rt rd shamt funct 6bit 5bit 5bit 5bit 5bit 6bit op rs rt rd shamt funct and $○, $△, $□ 000000 $△ $□ $○ 00000 100100 or $○, $△, $□ 000000 $△ $□ $○ 00000 100101 xor $○, $△, $□ 000000 $△ $□ $○ 00000 100110 R形式 命令 Created by Tsuneo Nakanishi, 2002-2004 論理演算命令(6) op rs rt address/immediate 6bit 5bit 6bit 16bit op rs rt address/immediate andi $○, $△, n 001100 $△ $○ n ori $○, $△, n 001101 $△ $○ n xori $○, $△, n 001110 $△ $○ n I形式 命令 Created by Tsuneo Nakanishi, 2002-2004 シフト命令(1) n ビット論理シフト演算: n ビット分を左右にずらし,はみ出した ビットを捨てて,空いたビットに 0 を補填する. n ビット左シフト: 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 0 n ビット右シフト: 0 1 1 1 0 1 1 0 0 0 0 1 1 1 0 1 1 0 Created by Tsuneo Nakanishi, 2002-2004 シフト命令(2) n ビット算術右シフト演算: n ビット分を右にずらし,はみ出した ビットを捨てて,空いたビットに 最上位ビット(符号ビット) を補填 する. n ビット右シフト: 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 Created by Tsuneo Nakanishi, 2002-2004 シフト命令(3) レジスタを n ビット論理左右シフト → レジスタ sll srl $○, $△, n $○, $△, n # $△ を n ビット論理左シフト → $○ # $△ を n ビット論理右シフト → $○ レジスタを n ビット算術右シフト → レジスタ sra $○, $△, n # $△ を n ビット算術右シフト → $○ Created by Tsuneo Nakanishi, 2002-2004 シフト命令(4) op rs rt rd shamt funct 6bit 5bit 5bit 5bit 5bit 6bit op rs rt rd shamt funct sll $○, $△, n 000000 00000 $△ $○ n 000000 srl $○, $△, n 000000 00000 $△ $○ n 000010 sra $○, $△, n 000000 00000 $△ $○ n 000011 R形式 命令 Created by Tsuneo Nakanishi, 2002-2004 転送命令(1) レジスタ/メモリ間(符号つき) lw lh lhu lb lbu sw sh sb $○, n($△) $○, n($△) $○, n($△) $○, n($△) $○, n($△) $○, n($△) $○, n($△) $○, n($△) # ($△ + n)番地 → $○,1ワード(32bit) # ($△ + n)番地 → $○,1ハーフワード(16bit) # ($△ + n)番地 → $○,1ハーフワード(16bit) # ($△ + n)番地 → $○,1バイト(8bit) # ($△ + n)番地 → $○,1バイト(8bit) # $○ → ($△ + n)番地,1ワード(32bit) # $○ → ($△ + n)番地,1ハーフワード(16bit) # $○ → ($△ + n)番地,1バイト(8bit) オフセット n には,16bit の2の補数表現の整数(–32768~32767)を指定できる. オフセット n は 32bit に符号拡張されてからベースレジスタに加算される. lw/sw 命令の対象番地は4の倍数,lh/sh 命令の対象番地は2の倍数でなければな らない.(整列化制約) lb/lh 命令では読み込むデータの符号拡張,lbu/lhu 命令ではゼロ拡張が行われる. Created by Tsuneo Nakanishi, 2002-2004 転送命令(2) lw/lh/lb/lhu/lbu/sw/sh/sb $○, n($△) $○ –32768 $△ zzzz lw/sw a b c d lh/sh X X a b lhu 0 0 a b lb/sb X X X a lbu 0 0 0 a +n 32767 a b c d Created by Tsuneo Nakanishi, 2002-2004 転送命令(3) I形式 op rs rt address/immediate 6bit 5bit 5bit 16bit 命令 op rs rt address/immediate lw $○, n($△) 100011 $△ $○ n sw $○, n($△) 101011 $△ $○ n lh $○, n($△) 100001 $△ $○ n lhu $○, n($△) 100101 $△ $○ n sh $○, n($△) 101001 $△ $○ n lb $○, n($△) 100000 $△ $○ n lbu $○, n($△) 100100 $△ $○ n sb $○, n($△) 101000 $△ $○ n Created by Tsuneo Nakanishi, 2002-2004 転送命令(4) 即値→レジスタ lui # $○の上位 16bit に n を格納 # $○の下位 16bit に 0 を格納 $○, n n $○ 0000…00 32bit 即値(nm)の転送 lui addi $○, n $○, m # $○の上位 16bit に n を格納 # $○の下位 16bit に m を格納(符号拡張あり) lui ori $○, n $○, m # $○の上位 16bit に n を格納 # $○の下位 16bit に m を格納(符号拡張なし) Created by Tsuneo Nakanishi, 2002-2004 転送命令(5) I形式 命令 lui $○, n op rs rt address/immediate 6bit 5bit 5bit 16bit op rs rt address/immediate 001100 00000 $○ n Created by Tsuneo Nakanishi, 2002-2004 分岐命令(1) j jal jr beq bne Label Label $○ $△, $□, Label $△, $□, Label # Label に無条件分岐 # Label に無条件分岐(関数呼出用) # $○の番地に無条件分岐 # $△ = $□ ならば Label に分岐 # $△ $□ ならば Label に分岐 命令によってジャンプできる範囲に違いがある.(後述) Created by Tsuneo Nakanishi, 2002-2004 分岐命令(2) R形式 op rs rt rd shamt funct 6bit 5bit 5bit 5bit 5bit 6bit op rs rt rd shamt funct 000000 $○ 00000 00000 00000 001000 命令 jr $○ op rs rt address/immediate 6bit 5bit 5bit 16bit 命令 op rs rt address/immediate beq $△, $□, Label 000100 $△ $□ d bne $△, $□, Label 000101 $△ $□ d I形式 Created by Tsuneo Nakanishi, 2002-2004 分岐命令(3) J形式 op address 6bit 26bit 命令 op immediate j Label 000010 ラベル Label の番地のビット27~2 jal Label 000011 ラベル Label の番地のビット27~2 擬似直接アドレッシング: j, jal 命令の分岐先番地 PC J形式 分岐先 b31~b28 j/jal b31~b28 整列化制約 b27~b0 address address 00 Created by Tsuneo Nakanishi, 2002-2004 アドレッシングモード アドレッシングモード: 機械語における番地指定,さらにはオペラ ンドの表現方法. アドレッシングモード 形式 説明 レジスタアドレッシング R 「$○」と直接レジスタを指定する形式. add, sub, and, or 命令など. ベース相対アドレッシング I 「n($○)」とベースレジスタとオフセットで主記憶の 番地を指定する形式.lw, sw 命令など. 即値アドレッシング I 「n」と定数を指定する形式.addi, subi, andi, ori 命令など. 擬似直接アドレッシング J 命令の番地を指定する形式.アセンブリ言語では ラベル名として表される.j, jal 命令など. PC相対アドレッシング I 命令の番地を指定する形式.アセンブリ言語では, 擬似直接アドレッシングと同様にラベル名として表 されるが,命令表現の形式と意味は異なる. beq, bne 命令など. Created by Tsuneo Nakanishi, 2002-2004 R形式(1) R形式 op rs rt rd shamt funct 6bit 5bit 5bit 5bit 5bit 6bit 命令 op rs rt rd shamt funct add $○, $△, $□ 000000 $△ $□ $○ 00000 100000 addu $○, $△, $□ 000000 $△ $□ $○ 00000 100001 sub $○, $△, $□ 000000 $△ $□ $○ 00000 100010 subu $○, $△, $□ 000000 $△ $□ $○ 00000 100011 slt $○, $△, $□ 000000 $△ $□ $○ 00000 101010 sltu $○, $△, $□ 000000 $△ $□ $○ 00000 101011 and $○, $△, $□ 000000 $△ $□ $○ 00000 100100 or $○, $△, $□ 000000 $△ $□ $○ 00000 100101 xor $○, $△, $□ 000000 $△ $□ $○ 00000 100110 Created by Tsuneo Nakanishi, 2002-2004 R形式(2) R形式 op rs rt rd shamt funct 6bit 5bit 5bit 5bit 5bit 6bit 命令 op rs rt rd shamt funct sll $○, $△, n 000000 00000 $△ $○ n 000000 srl $○, $△, n 000000 00000 $△ $○ n 000010 sra $○, $△, n 000000 00000 $△ $○ n 000011 jr $○ 000000 $○ 00000 00000 00000 001000 Created by Tsuneo Nakanishi, 2002-2004 I形式(1) I形式 op rs rt immediate 6bit 5bit 5bit 16bit 命令 op rs rt immediate addi $○, $△, n 001000 $△ $○ n addiu $○, $△, n 001001 $△ $○ n slti $○, $△, n 001010 $△ $○ n sltiu $○, $△, n 001011 $△ $○ n lui $○, $△, n 001111 $△ $○ n andi $○, $△, n 001100 $△ $○ n ori $○, $△, n 001101 $△ $○ n xori $○, $△, n 001110 $△ $○ n Created by Tsuneo Nakanishi, 2002-2004 I形式(2) I形式 op rs rt address 6bit 5bit 6bit 16bit 命令 op rs rt immediate lw $○, n($△) 100011 $△ $○ n sw $○, n($△) 101011 $△ $○ n lh $○, n($△) 100001 $△ $○ n lhu $○, n($△) 100101 $△ $○ n sh $○, n($△) 101001 $△ $○ n lb $○, n($△) 100000 $△ $○ n lbu $○, n($△) 100100 $△ $○ n sb $○, n($△) 101000 $△ $○ n Created by Tsuneo Nakanishi, 2002-2004 I形式(3) I形式 op rs rt address 6bit 5bit 6bit 16bit 命令 op rs rt address beq $△, $□, Label 000100 $△ $□ d bne $△, $□, Label 000101 $△ $□ d Created by Tsuneo Nakanishi, 2002-2004 I形式(4) PC相対アドレッシング: beq, bne 命令の分岐先番地 PC I形式 00 op rs rt address address を符号拡張 + 00 整列化制約: 命令の 番地は常に4の倍数. 分岐先(Label の番地) 00 Created by Tsuneo Nakanishi, 2002-2004 J形式 J形式 op address 6bit 26bit 命令 op immediate j Label 000010 ラベル Label の番地のビット27~2 jal Label 000011 ラベル Label の番地のビット27~2 擬似直接アドレッシング: j, jal 命令の分岐先番地 PC J形式 分岐先 b31~b28 j/jal b31~b28 整列化制約 b27~b0 address address 00 Created by Tsuneo Nakanishi, 2002-2004 分岐命令の守備範囲 00000000 10000000 PC相対アドレッシング (PCを中心に 218 番地の範囲) 20000000 30000000 40000000 50000000 PC JR命令は全域 60000000 70000000 擬似直接アドレッシング (PCを含むに 228 番地分のページ) D0000000 E0000000 F0000000 Created by Tsuneo Nakanishi, 2002-2004
© Copyright 2025 ExpyDoc