- 疑問:sw和lw指令,獲取的地址==不是4的整倍數(字節不對齊)==的時候,應該如何處理?
東南大學MOCC 計算機系統綜合設計 03
03-1 寄存器
介紹了MIPS寄存器,32個寄存器的基本功能和使用,注意
- 子程序調用寄存器
t
不保護與s
的保護 $31
寄存器在子程序嵌套調用下如何使用?$0
只能為0,寫入其他值將會被忽略,但是允許寫入,只是寫完也沒用
03-2 尋址方式
PC相對尋址
PC = (PC + 4) + ((sign-extend)imm << 2)
為什么要擴展后左移兩位?因為32位指令進行字節對齊后,一定是4的倍數,因此最低兩位一定是00
,所以就沒必要存儲上再占空間,而計算的時候,則要還原它。
(字節尋址而不是字尋址)
所有跳轉指令的目標地址,編譯存儲的時候,都會?4,實際運行的時候,都是乘以4還原。
04 典型指令講解
-
MinSysy-1不處理異常
-
add
和addu
的區別,前者溢出后進行異常處理,后者不進行,因此后者常用來進行地址計算(如果偏移量為負值,必然溢出,但實際上只是地址往上跳轉而已) -
由于暫時無異常處理,所以add和addu,addi和addiu實際一樣。
-
sub
和subu
也一樣,u
代表的含義是,溢出之后有沒有異常處理。 -
對于立即數運算,邏輯運算imm是零擴展(例如andi),算術運算imm是符號擴展(例如addi),這很好理解,邏輯運算沒有有無符號數的概念。(具體指令具體分析)
-
注意寫操作的
rs
和rt
的反著的,源是rt
,目標地址是rs + 偏移量
- 疑問:sw和lw指令,獲取的地址==不是4的整倍數(字節不對齊)==的時候,應該如何處理?(比如直接忽略不對齊的部分,或者報異常)
對于字讀取,如果不是4的倍數,那么最低兩位不是00
,但是存儲的時候,也一樣>> 2
,又會給抹掉了。
把16位立即數,賦值給32位寄存器的高16位。
對于beq
和bne
指令,判斷相等不相等,直接用減法(-)
判斷就行了。
- 小于則賦值,條件賦值指令
比大小,自然應該是算術運算,有符號數。
因此自然有無符號比較的小于置位
。
顯然是邏輯上的,因此是零擴展。
就類似于函數調用,調用完之后,要返回$31
值對應的地址。
jal和jr配合,就實現了過程調用和返回。
注意,有的是硬件設計相關,有的則是軟件設計相關。
小結
把握指令集功能的內在聯系,而不是堆砌它們。
- 零擴展還是符號擴展?
- 一般來說,算數運算是符號擴展
- 邏輯運算是零擴展
- 溢出檢測還是不檢測?(溢出:針對有符號數,正數 + 正數 = 負數、正數 - 負數 = 負數……)
- 算數運算,檢測溢出
- 邏輯運算、地址運算,沒必要檢測
- 等于不等于的判斷?直接復用減法就好了。