我被要求使用 .byte 和 .word 指令創建一個資料段,以將值 0x01、0x02、0x03、0x04 存盤為位元組,將值 0x12345678 存盤為一個字。我的代碼是:
.data
b1: .byte 0x01
b2: .byte 0x02
b3: .byte 0x03
b4: .byte 0x04
w1: .word 0x12345678
然后我想使用 lbu、lhu 和 lw 將值分別加載到 $t0、$t1、$t2 中:0x01、0x0201 和 0x12345678。
我為此做的是:
lbu $t0,b1 #this works
lhu $t1,0(b2) #this doesn't work, gets an error
lw $t2,w1 #also works
我的錯誤是inst/data fetch: 0x10010001 中的例外和未對齊地址。如何加載超過 1 個位元組作為半字?我在資料段中的變數宣告是否錯誤?我可能想要這樣的東西:
byte_array: .byte 0x01,0x02
謝謝大家的幫助。
uj5u.com熱心網友回復:
您正在嘗試加載lhu宣告為.byte. 那是大小不匹配,這會導致您遇到錯誤。
但是處理器并不關心大小不匹配,而是關心對齊。因此,如果您想加載半字(兩個位元組),它們必須從偶數位元組邊界開始,而您的資料設定并非如此。
lhu $t0, b1會起作用,也會起作用,lhu $t0,b3因為lhu $t0,w1這些資料的地址是偶數。但是,b2并且b4位于奇怪的地址。
AC 編譯器不會讓您首先執行大小不匹配的加載,而無需進行一些嚴重的強制轉換,這將使您回到 MIPS 上的這些未對齊錯誤。此外,x86 處理器將允許未對齊的訪問,盡管在某些情況下這些會比對齊的等價物慢。
因為未對齊的訪問需要更多的硬體,而且編譯器通常可以使用它們的型別系統來避免這些問題,所以一些設計選擇放棄額外的硬體,而 MIPS 就是其中之一。
您還可以通過插入填充來改變對齊方式——在b1&之間插入一個額外的位元組b2會改變b2' 對齊方式,允許加載b2和b3使用lhu. 因為w1被宣告為.word匯編器知道它需要是字對齊的,所以在b1&之間插入一個位元組b3將導致w1需要 3 個位元組的額外對齊填充(由于使用了.word資料宣告,匯編器將提供)。
當你使用這種大小不匹配的時候,也會出現位元組序的問題。MIPS 模擬器將使用與底層處理器相同的位元組序,因此在加載 2 個位元組時您通常會看到小位元組序行為。如果你宣告兩個.bytes而不是使用一個.half,你將不得不選擇一個位元組順序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/463859.html
上一篇:我遇到分段錯誤-裝配
