Senの競技プログラミング備忘録

こけた問題を自分用の解説で載せる。けんちょんさんのブログを目指したい。質的にも量的にも。こけた問題だけに限定するけど

パタヘネ第6版 第2章演習問題解答

6th editionについての解答。

解答がおかしいとかがありましたらSen(@nonpro3)TwitterアカウントにDMやリプライ飛ばしてください。

大体ここにある。ほとんどそろっている。先駆者様ありがとうございます!

上で事足りると思うが、ここにもあるよ!

ただし、これは最新の6th editionではないので、下に対応表と乗ってない問題の回答を載せる。

6th edition old
2.1 2.1
2.2 2.2
2.3 2.3
2.4 2.4
なし 2.5
なし 2.6
2.5 2.7
2.6 2.8
2.7 2.9
2.8 2.10
2.9 2.11
2.10 2.12
2.11 2.13
2.12 2.14
2.13 2.15
2.14 2.16
2.15 2.17
2.16 2.18
2.17 2.19
2.18 2.20
2.19 2.21
2.20 2.22
2.21 2.23
2.22 2.24(少し違う)
2.23 2.25
2.24 2.26
2.25 2.27
2.26 2.28
2.27 2.29
2.28 2.30
2.29 2.31
なし 2.32
2.30 2.33
2.31 2.34
2.32 2.35
2.33 2.36
2.34 2.37
2.35 2.38(全てじゃない)
2.36 なし
なし 2.39
なし 2.40
なし 2.41
なし 2.42
なし 2.43
2.37 2.44
2.38 2.45?(少し違う)
2.39 2.46
2.40 2.47
2.41 なし
2.42 なし

以下の者はすべて6th editionのもので新規追加された問題の回答。

2.22

2.22.1

jal命令は、J形式で、即値は32-6=26bit これで実際のPCで使用される値は、2進数に直すと末尾が00なので、26bitは2bit左へシフトして28bitとして扱う。そしてその際、上位4bitはプログラムカウンタの値そのままとして使って、変更しない。今回は0x 2000 0000なので上位4bitは変更されず、PCはjal命令を使っても、0x 2000 0000のまま。

2.22.2

beq命令は即値は16bit。実際は2bit左にシフトした18bitぶんだけPCをずらすことができる。この場合、即値の18bit相当分を32bitに符合拡張して、PCと足し合わせた範囲へ行ける。すなわち、0x 1FFF 0000 - 0x 2000 FFFF

2.35

問題文は\$t2について言及は一切ないが、上のブログを参考する限り、

レジスタ$t1にはアドレス0x10000000が保持されており,レジスタ$t2にはアドレス0x10000010が保持されているものとする.アドレス0x10000000に収められているデータ(16進数)は0x11223344であるとする.レジスタ$t2によって指されるアドレスには,どんな値が収められるか.

が本来の意味と思われる。

lbuは1バイトぶんだけ、下の1-8桁に入れる命令 なお上の24bitは0埋めされる。(lbなら符号拡張もされる)

2.35.1

ビッグエンディアンは、数字の上位桁がアドレスの小さい方になる。0x11223344なら、11側がアドレスが小さいので、スタート(アドレスが小さい左端)から数えて1バイトぶんを下1-8桁に入れるlbuは、0x00000011となる。それを$t2にロードしてるので、$t2にあるのは0x00000011

2.35.2

トルエンディアンは、数字の下位桁がアドレスの小さい方になっている。0x11223344なら、44側がアドレスが小さいので、lbuでロードする1バイトぶんは44となり、それは$t0では上1-8桁に入れる。よって$t2にあるのは0x44000000

ここは確信をもって正解かどうかわからない。

2.41, 2.42

よくわからないです……(院試に出なさそうなのでスキップ)