2013-02-12 194 views
2

我有一個考試來了,和實踐問題之一是:lb指令到底做了什麼?

假設$t0包含值0x12121212$t1包含 地址0x1000000

假設從地址0x1000000開始的存儲器數據是: 88 77 66 55

下面的代碼後,會是怎樣的$t0值執行:

lb $t0, 0($t1) 

一)0x00000088 B)0x88121212三)0xffffff88 d)0x12121288

我給的答案是a,因爲lb指令將讀取的字節(通過我對指令的作用的理解)是88.然後88將被存儲在$t0中,因此值w病是0x00000088。但給出的答案是c。我覺得我對lb的工作原理有一個基本的誤解 - 有人能解釋爲什麼答案是c

+1

看起來像我的標誌擴展 – 2013-02-12 15:55:24

+0

@Damien_The_Unbeliever我也這麼認爲,但我根本不明白爲什麼符號擴展已完成 - 你能解釋一個答案嗎? – Daniel 2013-02-12 15:59:41

回答

4

答案是c) 0xffffff88lb指令將字節符號擴展爲32位值。即最高有效位(msb)被複制到高24位中。

0x88 == 0b10001000,即msb是1.因此,高24位將是0b111111111111111111111111 == 0xffffff。

+0

謝謝!這爲我清除了它。 – Daniel 2013-02-12 16:03:37

3

lb指令從存儲器加載一個字節,並將sign extends加載到寄存器的大小。 lbu指令沒有符號擴展(無符號)。

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

大多數計算機,MIPS包括,使用two's complement來表示符號的值雖然有other ways to encode the sign,浮點通常在其使用符號量值IEEE 754格式表示。的整數符號值可以以任何數目的位來表示,例如

  • 在C char是8位,並且可以表示-128至+127
  • 在C short是16位並能代表-32768到+32767

在兩個互補的最顯著位可用於確定數字的符號,一個'1'意味着它是消極的,並且'0'意味着它是積極的。

當解釋爲8位二進制補碼時,數字0x88爲負值0x78或-120十進制。當用32位二進制補碼錶示時,這是0xFFFFFF88。有一對夫婦的方式來記住如何計算一個數字的二進制補碼:

  • 採取數量(反轉每一位)的一個人的補充和增加「1」,或
  • 從至少顯著去(從右到左),跳過每個'0'和你遇到的第一個'1',之後反轉每一位

要簽名擴展一個8位到32位只是看在最高有效位(位7)處,並將該位複製到位8到31 ......這是從二進制補碼的定義開始的。

+0

謝謝,但這只是我可以從維基百科獲得的信息,以及在我的教科書中寫的相同信息 - 我仍不明白爲什麼我的問題的答案是「c」。 – Daniel 2013-02-12 15:57:42

+0

@丹尼爾,曼德爾告訴你你的答案,甚至突出了相關部分。你應該閱讀標誌擴展。 – 2013-02-12 15:58:22

+0

@CarlNorum也許我的標題是誤導性的,但我沒有想到「爲什麼答案c?」成爲一個合適的標題,儘管這是我的實際問題。我也懷疑符號擴展(前面的'0xffffff'足夠清楚),但我不明白爲什麼符號擴展已完成。複製粘貼'lb'指令的標準定義並不是非常有用。 – Daniel 2013-02-12 16:00:56