4

試験が近づいていますが、練習問題の1つは次のとおりです。

$t0に値0x12121212$t1含まれ、アドレスが含まれていると想定します0x1000000

アドレスから始まるメモリデータ0x1000000は次 のとおりであると想定します88 77 66 55

$t0次のコードが実行された後の値はどうなりますか。

lb $t0, 0($t1)

a)0x00000088b)0x88121212c)0xffffff88d)0x12121288

私が答えたaのは、lb命令が読み取るバイト(命令が何をするかを理解しているため)が88であるためです。88はに格納される$t0ため、値はになります0x00000088。しかし、与えられた答えはでしたc。私はどのように機能するかについて根本的な誤解を持っているように感じますlb-誰かが答えがなぜであるか説明できますcか?

4

2 に答える 2

8

答えはですc) 0xffffff88。命令はlb、バイトを32ビット値に符号拡張します。つまり、最上位ビット(msb)が上位24ビットにコピーされます。

0x88 == 0b10001000、つまりmsbは1です。したがって、上位24ビットは0b111111111111111111111111==0xffffffになります。

于 2013-02-12T16:00:26.193 に答える
5

この命令は、メモリからレジスタのサイズにlbバイトをロードします。命令は、符号拡張なし(符号なし)でも同じことを行いますsign extendslbu

http://en.wikipedia.org/wiki/MIPS_architecture#Integer

MIPSを含むほとんどのコンピューターは、符号付きの値を表すために2の補数を使用しますが、符号をエンコードする方法は他にもあります。浮動小数点は通常、符号付きの大きさを使用するIEEE754形式で表されます。整数の符号付き値は、たとえば、任意の数のビットで表すことができます。

  • Cのacharは8ビットで、-128〜+127を表すことができます
  • Cのashortは16ビットで、-32768〜+32767を表すことができます

2の補数では、最上位ビットを使用して数値の符号を決定できます。これは'1'、負の数を意味し、'0'正の数を意味します。

数値0x88は、8ビットの2の補数として解釈される場合、負の0x78または-120の10進数です。32ビットの2の補数で表される場合、これは0xFFFFFF88です。数値の2の補数を計算する方法を覚えておく方法はいくつかあります。

  • 数値の1の補数を取り(すべてのビットを反転)、「1」を追加するか、または
  • 最下位ビットから最上位ビット(右から左)に移動し、遭遇するすべての「0」と最初の「1」をスキップし、その後すべてのビットを反転します

8ビットを32ビットに符号拡張するには、最上位ビット(ビット7)を調べ、そのビットをビット8から31にコピーします...これは、2の補数の定義に基づいています。

于 2013-02-12T15:56:00.033 に答える