2016-10-03 127 views
1

的價值所以我有一個「小尾數」 MIPS計劃:確定寄存器

.data   
arr: .word 12, -2, 45, 0, 0 
    .text 
la $8,arr 
lb $9,2($8) 
lbu $10,4($8) 
sw $10,12($8) 
lb $11,12($8) 

的問題是確定的$10$11值。答案是254和-2,但我不知道爲什麼。那麼你可以向我解釋一下嗎?謝謝(對不起我的英語不好)

+0

lb說明它可以幫助如果你說什麼,你認爲他們應該是,爲什麼。這樣,我們就可以更好地瞭解您遇到的問題,併爲您提供更好的答案。 – 8bittree

回答

0

總體而言,需要注意的最重要的事情是,有兩個「負載字節」的說明:

  1. lbu [中無符號形式]它加載一個字節到寄存器的低8位和「零擴展」(用零填充剩餘的字節)
  2. lb [簽署的形式],它將一個字節加載到寄存器的低8位和「符號擴展」(填充剩餘的字節與加載字節的最高有效位)(即)fill_byte = (fetch_byte & 0x80) ? 0xFF : 0x00

這裏是數據陣列的放大圖。所有數據行都是相同的值,但有不同的視角。請注意,在轉換爲十六進制後,十六進制字節模式爲小端,所以字節順序相反。所以,在做字節操作時,我們應該引用字節線,並應用任何偏移,我們需要:

offset 0    4    8    12   16 
dec  12    -2    45    0   0 
hexw 0000000C  FFFFFFFE  0000002D  00000000 00000000 
byte 0C,00,00,00  FE,FF,FF,FF  2D,00,00,00  00,00,00,00 00,00,00,00 

這是程序的第一步:

la  $8,arr     # get address of array 

這裏是第二步:

lb  $9,2($8)    # get signed byte (00) -- ignored 
    lbu  $10,4($8)    # get unsigned byte (FE) and zero extend 

在此之後,$10具有0x000000FE,這是十進制


254這裏是第三步:現在

sw  $10,12($8)    # store into cell 

,數據陣列已經被改變[在偏移12]:

offset 0    4    8    12   16 
dec  12    -2    45    254   0 
hexw 0000000C  FFFFFFFE  0000002D  000000FE 00000000 
byte 0C,00,00,00  FE,FF,FF,FF  2D,00,00,00  FE,00,00,00 00,00,00,00 

這是最後一個st EP:

# get byte from cell (FE) 
    # sign extend it: FE --> FFFFFFFE 
    # FFFFFFFE is -2 
    lb  $11,12($8)    # get byte and _sign_ extend it 

記住上面