協(xié)處理器及其他指令之:協(xié)處理器指令
9.1協(xié)處理器指令
ARM體系結(jié)構(gòu)允許通過增加協(xié)處理器來擴展指令集。最常用的協(xié)處理器是用于控制片上功能的系統(tǒng)協(xié)處理器。例如控制Cache和存儲管理單元的CP15寄存器。此外,還有用于浮點運算的浮點ARM協(xié)處理器,各生產(chǎn)商還可以根據(jù)需要開發(fā)自己的專用協(xié)處理器。
ARM協(xié)處理器具有自己專用的寄存器組,它們的狀態(tài)由控制ARM狀態(tài)的指令的鏡像指令來控制。
程序的控制流指令由ARM處理器來處理,所有協(xié)處理器指令只能同數(shù)據(jù)處理和數(shù)據(jù)傳送有關(guān)。按照RISC的Load/Store體系原則,數(shù)據(jù)的處理和傳送指令是被清楚分開的,所以它們有不同的指令格式。
ARM處理器支持16個協(xié)處理器,在程序執(zhí)行過程中,每個協(xié)處理器忽略ARM和其他協(xié)處理器指令。當一個協(xié)處理器硬件不能執(zhí)行屬于它的協(xié)處理器指令時,將產(chǎn)生一個未定義指令異常中斷,在該異常中斷處理過程中,可以通過軟件仿真該硬件操作。如果,一個系統(tǒng)中不包含向量浮點運算器,則可以選擇浮點運算軟件包來支持向量浮點運算。
ARM協(xié)處理器可以部分地執(zhí)行一條指令,而后產(chǎn)生中斷。如除法運算除數(shù)為0和溢出,這樣可以更好地處理運行時產(chǎn)生(run-time-generated)的異常。但是,指令的部分執(zhí)行是由協(xié)處理器完成的,此過程對ARM來說是透明的。當ARM處理器重新獲得執(zhí)行時,它將從產(chǎn)生異常的指令處開始執(zhí)行。
對某一個協(xié)處理器來說,并不一定用到協(xié)處理器指令中的所有的域。具體協(xié)處理器如何定義和操作完全由協(xié)處理器的制造商自己決定,因此ARM協(xié)處理器指令中的協(xié)處理器寄存器的標識符以及操作助記符也有各種不同的實現(xiàn)定義。程序員可以通過宏定義這些指令的語法格式。
ARM協(xié)處理器指令分以下3類。
·協(xié)處理器數(shù)據(jù)操作。協(xié)處理器數(shù)據(jù)操作完全是協(xié)處理器內(nèi)部操作,它完成協(xié)處理器寄存器的狀態(tài)改變。如浮點加運算,在浮點協(xié)處理器中兩個寄存器相加,結(jié)果放在第3個寄存器中。這類指令包括CDP指令。
·協(xié)處理器數(shù)據(jù)傳送指令。這類指令從寄存器讀取數(shù)據(jù)裝入?yún)f(xié)處理器寄存器,或?qū)f(xié)處理器寄存器的數(shù)據(jù)裝入存儲器。因為協(xié)處理器可以支持自己的數(shù)據(jù)類型,所以每個寄存器傳送的字數(shù)與協(xié)處理器有關(guān)。ARM處理器產(chǎn)生存儲器地址,但傳送的字節(jié)由協(xié)處理器控制。這類指令包括LDC和STC指令。
·協(xié)處理器寄存器傳送指令。在某些情況下,需要ARM處理器和協(xié)處理器之間傳送數(shù)據(jù)。如一個浮點運算協(xié)處理器,F(xiàn)IX指令從協(xié)處理器寄存器取得浮點數(shù)據(jù),將它轉(zhuǎn)換為整數(shù),并將整數(shù)傳送到ARM寄存器中。經(jīng)常需要用浮點比較產(chǎn)生的結(jié)果來影響控制流,因此,比較結(jié)果必須傳送到ARM的CPSR中。這類協(xié)處理器寄存器傳送指令包括MCR和MRC。
表9.1列出了所有協(xié)處理器處理指令。
表9.1 協(xié)處理器指令
助記符 | 操作 |
CDP | 協(xié)處理器數(shù)據(jù)操作 |
LDC | 裝載協(xié)處理器寄存器 |
MCR | 從ARM寄存器傳數(shù)據(jù)到協(xié)處理器寄存器 |
MRC | 從協(xié)處理器寄存器傳數(shù)據(jù)到ARM寄存器 |
STC | 存儲協(xié)處理器寄存器 |
9.1.1協(xié)處理器數(shù)據(jù)操作指令CDP
1.指令編碼格式
此指令用于控制數(shù)據(jù)在協(xié)處理器寄存器內(nèi)部的操作。通常情況下該指令由協(xié)處理器完成,如果協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義指令異常。
指令的編碼格式如圖9.1所示。
圖9.1CDP指令編碼格式
評論