ARM7的體系結(jié)構(gòu)
一.存儲器的字與半字
1.從偶數(shù)地址開始的連續(xù)的兩個字節(jié)構(gòu)成一個半字。
2.能被4整除的地址的連續(xù)4個字階構(gòu)成一個字
ARM指令的長度剛好是一個字,Thumb指令的長度剛好是一個半字
二.存儲器的存儲方式(半字對齊,字對齊)
1.半字對齊:存放一個數(shù)據(jù)的地址如果能被二整除,則它是半字對齊。反之,則是非半字對齊。
2.字對齊:存放一個數(shù)據(jù)的地址如果能被四整除,則它是字對齊。否則,它是非字對齊。
三.ARM處理器狀態(tài):
ARM有兩種處理器狀態(tài):ARM狀態(tài),Thumb狀態(tài)。
1.ARM狀態(tài):32位。處理器執(zhí)行字方式的ARM指令。
2.Thumb狀態(tài):16位。處理器執(zhí)行半字方式的Thumb指令。
注:兩個狀態(tài)之間的切換是不會影響處理器的模式或寄存器的內(nèi)容。
它們之間是如何進行切換的。
使用BX指令在ARM和Thumb狀態(tài)之間進行切換。
(但是,所有的異常處理都是在ARM狀態(tài)中執(zhí)行。如果異常發(fā)生在Thumb狀態(tài)中,處理器會切換到ARM狀態(tài)。在異常處理返回時,自動切換回Thumb狀態(tài)。)
從ARM狀態(tài)切換到Thumb狀態(tài)的程序代碼:
具體程序來說明處理器狀態(tài):
程序1:
ADRR0,TST+1
注:偽指令A(yù)DR將寄存器內(nèi)容的地址存入寄存器中。這里將地址TST+1存入R0中,這樣就加載了轉(zhuǎn)移地址并且設(shè)置了最近有效位。
BXR0
注:此時,R0中數(shù)值的第0位是1,所以該語句執(zhí)行完處理器切換進入Thumb狀態(tài),開始執(zhí)行Thumb指令
(我們可以在AXD下看到此時狀態(tài)寄存器的T位被置1.)
CODE16
注:
A匯編器需要知道什么時候產(chǎn)生ARM代碼,什么時候產(chǎn)生Thumb代碼。
B偽指令CODE16定義一下的程序被編譯成Thumb模式,即后面的就是16位的Thumb指令了。
C.偽指令CODE32定義一下的程序?qū)⒈痪幾g成ARM模式,即后面的就是32位的ARM指令。
D偽指令CODE16和CODE32只是指示匯編器后面指令的類型,并不產(chǎn)生任何代碼,也不進行程序狀態(tài)的切換。
程序2:
注:
在Thumb狀態(tài)下,調(diào)用軟中斷:SWI 0XAB
在ARM狀態(tài)下,調(diào)用軟中斷:SWI 0X123456
四.ARM處理器模式:
ARM體系結(jié)構(gòu)支持7中處理器模式:用戶模式,快中斷模式,中斷模式,管理模式,中止模式,未定義模式和系統(tǒng)模式。
1.快中斷模式,中斷模式,管理模式,中止模式和未定義模式。它們稱為異常模式。
A.異常模式既可以通過程序切換進入外,也可以有特定的異常進入。
B.當(dāng)特定的異常出現(xiàn)時,處理器進入相應(yīng)餓模式。每種模式都有某些附加的寄存器。
2.系統(tǒng)模式和用戶模式,它們不能由異常進入。并且使用與用戶模式相同的寄存器。
A.系統(tǒng)模式是特權(quán)模式,不受用戶模式的限制。操作系統(tǒng)在該模式下訪問用戶模式的寄存器比較方便。
五.ARM體系的存儲系統(tǒng)
1.ARM7存儲系統(tǒng)概要:
1>.ARM7處理器采用馮.諾依曼結(jié)構(gòu),指令和數(shù)據(jù)共用一條32位數(shù)據(jù)總線(采用指令,數(shù)據(jù)和I/O統(tǒng)一編址)。
只有裝載,保存和交換指令可訪問存儲器中的數(shù)據(jù)。
Tiger補充:
計算機結(jié)構(gòu)說明:
1>馮諾依曼結(jié)構(gòu):把代碼作為一中特殊的數(shù)據(jù)來操作。指令總線和數(shù)據(jù)總線及其存儲區(qū)域是統(tǒng)一的。
2>哈佛結(jié)構(gòu):指令總線和數(shù)據(jù)總線及其存儲區(qū)域是分開獨立的。
2>.ARM芯片一般在處理器核和外部存儲器之間有
一個存儲器管理部件。
存儲器管理部件的作用是將局部總線的信號和時序轉(zhuǎn)換為現(xiàn)實的外部總線信號和時序。
注:各芯片生產(chǎn)商制定了自己的外部總線的信號和時序。
3.地址空間
1>ARM地址空間有232個8位字節(jié)的地址空間。也可以看作是230個32位字或231個16位半字。
2>如果在取指操作時地址發(fā)生溢出,只要沒有執(zhí)行預(yù)取的無效指令,就不會導(dǎo)致異常。
4.存儲器格式:
1>地址空間的規(guī)則要求一個字或半字要求連續(xù)存儲。
Eg:位于地址0x02處的字,它所包含的字節(jié)位于地址0x02,0x03,0x04,0x5
同理位于地址0x02處的半字,它所包含的字節(jié)位于地址0x02,0x03.
2>存儲器系統(tǒng)有兩種映射機制:
A.小端存儲器系統(tǒng):
數(shù)據(jù)的高字節(jié)存放在高地址中。
B.大端存儲器系統(tǒng):
數(shù)據(jù)的高字節(jié)存放在低地址中。
3>非對齊的存儲器訪問
A.ARM結(jié)構(gòu)希望所有存儲器訪問時都對齊。即字訪問的地址是字對齊的,或半字訪問使用的地址是半字對齊的。若不滿足上述條件的即為非對齊的存儲器訪問。
B.把一個非字對齊(或非半字對齊)的地址寫入ARM狀態(tài)(或Thumb狀態(tài)的)R15寄存器中,將會引起非對齊的指令取指。
C.在一個非字對齊(或非半字對齊)的地址處讀寫一個字或半字會引起非對齊的數(shù)據(jù)訪問。
注:編程時應(yīng)該注意的問題:
ARM處理器直接支持對齊存放的半字或字數(shù)據(jù)的存取,也就是可以使用一條相應(yīng)的指令來實現(xiàn)對應(yīng)操作。如果訪問非對齊的半字或字數(shù)據(jù),將需要多條指令組合才能實現(xiàn)對應(yīng)操作,這對程序的執(zhí)行效率影響較大。因此,在C語言編程中,定義的多字節(jié)變量或結(jié)構(gòu)體,最好使其為對齊存放。