ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

Exercise 2.1

Exercise 2.1
Using the MIPS program in Exercise 2.34 (with bugs intact), determine the instruction format for each instruction and the decimal values of each instruction field.

Exercise 2.34のコードをPCspimで読み込んで、コードをダンプします。

0x20020000  addi $2, $0, 0                  
0x8c830000  lw $3, 0($4)                    
0xaca30000  sw $3, 0($5)                    
0x20840004  addi $4, $4, 4                  
0x20a50004  addi $5, $5, 4                  
0x1060fffc  beq $3, $0, -16 [loop-0x00400038]

命令のフォーマットは、CDのAppendix Aに説明があります。A-49 Instruction Formatを見ましょう。本来は、bitの並びから命令を見つけるのですが、今回は命令が分かっているのでそちらから追いました。

1つ目の命令:addi $2, $0, 0

0x20020000 addi $2, $0, 0
addiのフォーマットは、addi(6) rs(5), rt(5), imm(16)です。()の中はbit数。
最初の6bitが0x08でaddi命令であることを示しています。0x08は2進数で書くと00_1000です。同じようにrsが2進数で0_0000、rtが$2レジスタなので、2進数の0_0010、immが0なので、2進数の0000_0000 0000_0000になります。これらをつないで16進数で表すと、0x2002000になります。

念のために一個ずつ整理しました。


フィールド毎の表記 00_1000 0_0000 0_0010 0000_0000 0000_0000
8bitに揃える  0010_0000 0000_0010 0000_0000 0000_0000
16進表記 20020000

2つ目の命令:lw $3, 0($4)

0x8c830000 lw $3, 0($4)
各フィールド(bit幅) 16進表記、2進表記の順に書いていきます。
lw(6) 0x23 10_0011
rs(5) 0x00 0_0100
rt(5) 0x03 0_0011
offset(16) 0x0000 0000_0000 0000_0000

全部合わせて
1000_1100 1000_0011 0000_0000 0000_0000 → 0x8c830000

3つ目の命令:sw $3, 0($5)

0xaca30000 sw $3, 0($5)

sw(6) 0x2b 10_1011
rs(5) 0x00 0_0101
rt(5) 0x03 0_0011
offset(16) 0x0000 0000_0000 0000_0000

全部合わせて
1010_1100 1010_0011 0000_0000 0000_0000 → 0xACA30000

4つ目の命令:addi $4, $4, 4

0x20840004 addi $4, $4, 4

addi(6) 0x08 00_1000
rs(5) 0x04 0_0100
rt(5) 0x04 0_0100
imm(16) 0x0004 0000_0000 0000_0100

全部合わせて
0010_0000 1000_0100 0000_0000 0000_0100 → 0x20840004

5つ目の命令:addi $5, $5, 4

0x20a50004 addi $5, $5, 4

addi(6) 0x08 00_1000
rs(5) 0x05 0_0101
rt(5) 0x05 0_0101
imm(16) 0x0004 0000_0000 0000_0100

全部合わせて
0010_0000 1010_0101 0000_0000 0000_0100 → 0x20A50000

6つ目の命令:beq $3, $0, -16

0x1060fffc beq $3, $0, -16

アセンブラの方にある-16という値は、今の番地から見てジャンプ先(lw命令)までのバイト数を表しています。負の値なので、条件を満たせば16バイト戻ってくださいという意味です。MIPSの命令フォーマットでは、ジャンプ命令はバイト数ではなく命令数を数えます。1命令=32bit(4バイト)なので、-16は-4になって命令に格納されます。MIPSの命令は32bitの境界に合わせて配置され、下位2ビットは常に0になるので命令の中には不要という事です。CD-ROMの A-59 Branch Instructionsも参照してください。

beq(6) 0x04 00_0100
rs (5) 0x03 0_0011
rt(5) 0x03 0_0000
label(16) 0xFFFC 1111_1111 1111_1100

全部合わせて
0001_0000 0110_0000 1111_1111 1111_1100 → 0x1060FFFC