第一章:概述
GBA的處理器是一塊任天堂定製的CPU。很多人稱之為ARM7tdmi,也可以說是對的,不過ARM7隻是一個核,還有其他很多東西在這塊晶片上。另一個有趣的事情是ARM公司並沒有製造這塊晶片,他只是授權了設計。不過總的來說(我們不在意 ;)),GBA裡面有個32位的ARM7tdmi。
這塊CPU有兩個指令集,ARM和THUMB。(現在只是一個概述,如果不明白這些東西也沒關係。)
ARM指令集都是多功用的,大多都內建一個位移指令,也就是說類似於“r3 = r2 + r1<<4”這樣的東西會包含在一條指令中(當然,不是這麼個寫法)。指令長度都固定為32位,所以如果要載入一個32位立即數是不可能的,只能做一次記憶體訪問,但這又會很慢。當然我會示範一種(或者說兩種)更快點的方法。還有一點要知道,這些指令都能條件執行!很多指令都能讓你選擇是否更新到條件標誌(比如說你可以執行一條減法指令但是不影響進位標誌)。由於大多指令都內建位移操作,所以沒有一個單獨的位移指令。
THUMB指令集就顯得功能單薄,實際上,大多數都只有一個功能。THUMB指令大小固定為16位,相同的指令(大多數指令在兩個指令集中都有對應)會運行得比ARM更快些,不過只是從ROM啟動並執行情況,因為ROM是16位匯流排的。只有分支指令是條件執行的,你也不能禁止指令更新到條件標誌(比如說ADD總是會影響到進位,溢出,全零和符號標誌)。
ARM7處理器有16個32位寄存器(儘管只有前7個寄存器r0-r6對THUMB模式有效):
r0-r12: GRPs(General Purpose Registers)
r13: 一般用作棧指標(SP),如果你不使用棧的話(小程式或者其他什麼的),也能當成GPR用。
r14: 串連寄存器(Link register),也能當成GPR用,不過他主要的用途還是執行分支指令或者串連指令(子函數調用)時儲存返回地址。
r15: 程式計數器(PC),存放當前指令地址+8。ARM7使用3階段流水線,所以你讀取PC的時候,得到的是讀取指令後面第2條指令的地址。
(譯註:第一階段擷取指令,第二階段解碼,而第三階段實際執行它。故此,程式計數器總是超出當前執行的指令兩個指令。
在為分支指令計算位移量時必須計算在內。)
下面是兩個指令集的優缺點列表:
ARM
優點:
多功用
所有指令都可條件執行
可選擇是否更新到條件標誌
缺點:
在ROM中比THUMB慢
THUMB
優點:
在ROM中比ARM快
指令小
缺點:
指令必須更新條件標誌
只有分支指令才能條件執行
大多數指令只能用到r0-r6