我正在努力掌握如何操作/比較MIPS中存盤在暫存器(字/半字/中間值)中的資料。如果它們各自代表不同數量的位元組有什么關系嗎?例如,通過li加載一個即時值,如5,然后加載一個字,如5,最后用bne進行比較,這是否有效?
uj5u.com熱心網友回復:
如果它們各自代表不同數量的位元組,這有什么關系嗎?
簡短的回答。不,這并不重要,因為5就是5。
更長的答案。MIPS 暫存器的寬度都是 32 位,從某種意義上說,除了位元組和半字的加載/存盤指令外,沒有辦法一次操作少于 32 位。
例如,如果你的資料在記憶體中,并且是8位寬(例如字符或位元組),并且是有符號(無符號)的資料型別,那么你可以使用lb(lbu)將其加載到一個32位的暫存器中,同時也將8位的值符號(0)擴展到32位。 在數值上,符號(0)擴展保持值不變,所以你現在可以在暫存器中處理32位的值。
(當然,你必須事先知道8位資料是否是數字,并應進行符號與零擴展。 我們在高級語言中通過邏輯變數的宣告(和永久)資料型別知道這一點,但在匯編中,我們正在與不一定有永久資料型別的物理存盤一起作業。
如果你的資料不是8位或16位寬(或32位),你可以使用單個位元組,或者從記憶體中加載比你感興趣的更多的資料,并清除或標志擴展與你無關的位。
uj5u.com熱心網友回復:
你知道當與 等運算子一起使用時,C是如何隱含地將每個狹義的整數型別提升為int的嗎? 這種語言設計與 MIPS 這樣的架構相匹配,MIPS 本身沒有 8 或 16 位的整數操作,只有 int / unsigned int 的大小。 (如果你使用多條指令來做擴展精度的數學運算,則會更寬)
MIPS指令總是將其即時符號擴展到32位。 (
MIPS 指令總是將其即時符號擴展到 32 位,(或者對位布爾指令進行零擴展)。
有些操作可以不關心高位,如果你只關心低位,以便以后sb,但MIPS的比較,如slt或beq總是看所有的位。 如果只想得到結果的低位,哪些2's complement整數運算可以在不調零輸入的高位的情況下使用?
在C語言中,將結果分配給一個窄的整數會再次截斷結果,所以這就像做一個sb或sh。 (實際上在C語言中,它被定義為模數減少值以適應型別的值范圍,但是對于無符號或2's complement有符號整數來說,這可以被實作為只是截斷位元模式。)
也可以參考Erik的觀點,他說:"如果你是一個有符號的整數,那么你可以把它截斷。
更多關于使用lb與lbu進行有符號或零擴展加載到32位的asm細節,也請參見Erik的回答
這并不是一個巧合,MIPS的標準呼叫慣例要求狹窄的函式args和回傳值,如char foo(short x)正確地將符號擴展到全暫存器寬度。 關于這一點,請看MIPS在這個x86-64問題上的比較腳注,該ISA如何處理窄資料。MOVZX丟失32位暫存器到64位暫存器
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/320381.html
標籤:
上一篇:沒有'IEnumerable<SelectListItem>'型別的ViewData專案具有'ddlcontent'鍵。
