總體而言,需要注意的最重要的事情是,有兩個「負載字節」的說明:
lbu
[中無符號形式]它加載一個字節到寄存器的低8位和「零擴展」(用零填充剩餘的字節)
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
記住上面
爲
lb
說明它可以幫助如果你說什麼,你認爲他們應該是,爲什麼。這樣,我們就可以更好地瞭解您遇到的問題,併爲您提供更好的答案。 – 8bittree