freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

常用armv4指令集與匯編-資料下載頁

2025-04-17 04:52本頁面
  

【正文】 del 協(xié)處理器的特定操作碼。CRd作為目標(biāo)寄存器的協(xié)處理器寄存器。CRn存放第1個操作數(shù)的協(xié)處理器寄存器。CRm存放第2個操作數(shù)的協(xié)處理器寄存器。 opcode2可選的協(xié)處理器特定操作碼。MRC 指令舉例如下:MRC p5,2,R2,c3,c2 MRC p7,0,R0,c1,c2,1ARM 雜項指令助記符說明操作條件碼位置SWI immed_24軟中斷指令產(chǎn)生軟中斷,處理器進(jìn)入管理模式SWI{cond}MRS Rd,psr讀狀態(tài)寄存器指令Rd←psr,psr 為 CPSR 或 SPSRMRS{cond}MSR psr_fields,Rd/immed_8r寫狀態(tài)寄存器指令psr_fields←Rd/immed_8r,psr 為 CPSR 或 SPSRMSR{cond}◆ SWI軟中斷指令。SWI 指令用于產(chǎn)生軟中斷,從而實現(xiàn)在用戶模式變換到管理模式,CPSR 保存到管理模式的 SPSR 中,執(zhí)行轉(zhuǎn)移到 SWI 向量,在其它模式下也可使用 SWI 指令,處理同樣地切換到管理模式。有資料顯示,應(yīng)用程序要想主動從用戶空間切換到系統(tǒng)空間,只能采取這種方式。SWI也稱為自陷指令。指令格式如下:SWI{cond} immed_24其中,immed_24,24位立即數(shù),值為0~16777215之間的整數(shù)。最終程序可以通過這個立即數(shù)判斷要采取什么操作來處理這個軟件中斷,具體的處理函數(shù)要由用戶自己實現(xiàn)。SWI指令舉例如下:SWI 0 ;軟中斷,中斷立即數(shù)為 0SWI 0x123456 ;軟中斷,中斷立即數(shù)為 0x123456使用SWI指令時,通常使用以下兩種方法進(jìn)行傳遞參數(shù),SWI異常中斷處理程序就可以提供相關(guān)的服務(wù),這兩種方法均是用戶軟件協(xié)定。SWI異常中斷處理程序要通過讀取 引起軟中斷的SWI 指令,以取得24位立即數(shù)。 位的立即數(shù)指定了用戶請求的服務(wù)類型,參數(shù)通過用寄存器傳遞。MOV R0,34 ;設(shè)置了功能號為 34SWI 12 ;調(diào)用 12 號軟中斷 24 位立即數(shù)被忽略,用戶請求的服務(wù)類型由寄存器 R0 的值決定,參數(shù)通過其它的通用寄存器傳遞。MOV R0,12 ;調(diào)用 12 號軟中斷MOV R1,34 ;設(shè)置子功能號為 34SWI 0 在 SWI 異常中斷處理程序中,取出 SWI 立即數(shù)的步驟為:首先確定引起軟中斷的 SWI 指令是 ARM 指令還時 Thumb 指令,這可通過對 SPSR 訪問得到。然后要取得該 SWI 指令的地址,這可通過訪問 LR 寄存器得到。接著讀出指令,分解出立即數(shù)。讀出 SWI 立即數(shù)。T_bit EQU 0x20 SWI_HanderSTMFD SP!,{R0_R3,R12,LR} ;現(xiàn)場保護(hù)MRS R0,SPSR ;讀取 SPSRSTMFD SP!,{R0} ;保存 SPSRTST R0,T_bit ;測試 T 標(biāo)志位LDRNEH R0,[LR,2] ;若是 Thumb 指令,讀取指令碼(16 位)BICNE R0,R0,0xFF00 ;取得 Thumb 指令的 8 位立即數(shù) LDREQ R0,[LR,4] ;若是 ARM 指令,讀取指令碼(32位)BICNQ R0,R0,0xFF00000 ;取得 ARM 指令的 24 位立即數(shù)…LDMFD SP!,{R0R3,R12,PC} ;SWI 異常中斷返回◆ MRS讀狀態(tài)寄存器指令。在 ARM 處理器中,只有 MRS 指令可以狀態(tài)寄存器 CPSR 或 SPSR 讀出到通用寄存器中。指令格式如下:MRS{cond} Rd ,psr其中,Rd目標(biāo)寄存器。Rd 不允許為R15。psr為CPSR 或 SPSR。SWI 指令舉例如下:MRS R1,CPSR ;將 CPSR 狀態(tài)寄存器讀取,保存到 R1 中MRS R2,SPSR ;將 SPSR 狀態(tài)寄存器讀取,保存到 R2 中MRS指令讀取CPSR,可用來判斷ALU的狀態(tài)標(biāo)志,或 IRQ,F(xiàn)IQ中斷是否允許等;在異常處理程序中,讀SPSR可知道進(jìn)行異常前的處理器狀態(tài)等。MRS與 MSR配合使用,實現(xiàn)CPSR或SPSR寄存器的讀—修改—寫操作,可用來進(jìn)行處理器模式切換,允許/禁止IRQ/FIQ中斷等設(shè)置。另外,進(jìn)程切換或允許異常中斷嵌套時,也需要使用 MRS 指令讀取 SPSR 狀態(tài)值,并保存起來。使能 IRQ 中斷ENABLE_IRQMRS R0,CPSRBIC R0,R0,0x80MSR CPSR_c,R0MOV PC,LR禁能 IRQ 中斷DISABLE_IRQMRS R0,CPSRORR R0,R0,0x80 MSR CPSR_c,R0 MOV PC,LR◆ MSR寫狀態(tài)寄存器指令。在 ARM 處理器中。只有 MSR 指令可以直接設(shè)置狀態(tài)寄存器 CPSR 或 SPSR。指令格式如下:MSR{cond} psr_fields,immed_8r MSR{cond} psr_fields,Rm其中,psr為CPSR 或 SPSR的fields 指定傳送的區(qū)域。Fields 可以是以下的一種或多種(字母必須為小寫):c 控制域屏蔽字節(jié)(psr[7…0])x 擴(kuò)展域屏蔽字節(jié)(psr[15…8])s 狀態(tài)域屏蔽字節(jié)(psr[23…16])f 標(biāo)志域屏蔽字節(jié)(psr[31…24])immed_8r 要傳送到狀態(tài)寄存器指定域的立即數(shù),8 位。Rm 要傳送到狀態(tài)寄存器指定域的數(shù)據(jù)的源寄存器。 MSR 指令舉例如下:MSR CPSR_c,0xD3 ;CPSR[7…0]=0xD3,即切換到管理模式。MSR CPSR_cxsf,R3 ;CPSR=R3只有在特權(quán)模式下才能修改狀態(tài)寄存器。程序中不能通過 MSR 指令直接修改 CPSR 中的T控制位來實現(xiàn)ARM狀態(tài)/Thumb 狀態(tài)的切換,必須使用BX指令完成處理器狀態(tài)的切換(因為BX指令屬轉(zhuǎn)移指令,它會打斷流水線狀態(tài),實現(xiàn)處理器狀態(tài)切換)。MRS與MSR配合使用,實現(xiàn)CPSR或SPSR寄存器的讀 修改寫操作,可用來進(jìn)行處理器模式切換、允許/禁止 IRQ/FIQ 中斷等設(shè)置。堆棧指令實始化INITSTACKMOV R0,LR ;保存返回地址;設(shè)置管理模式堆棧MSR CPSR_c,0xD3LDR SP,StackSvc;設(shè)置中斷模式堆棧MSR CPSR_c,0xD2LDR SP,StackIrq…ARM 偽指令A(yù)RM 偽指令不是ARM指令集中的指令,只是為了編程方便編譯器定義了偽指令,使用時可以像其它 ARM 指令一樣使用,但在編譯時這些指令將被等效的 ARM 指令代替。ARM 偽指令有四條,分別為ADR偽指令,ADRL偽指令,LDR 偽指令,NOP偽指令?!?ADR小范圍的地址讀取偽指令。ADR指令將基于PC相對偏移的地址值讀取到寄存器中。在匯編編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該ADR偽指令的功能,若不能用一條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。ADR 偽指令格式如下 ADR{cond} register,exper其中,register加載的目標(biāo)寄存器exper地址表達(dá)式。當(dāng)?shù)刂分凳欠亲謱R時,取值范圍255~255字節(jié)之間;當(dāng)?shù)刂肥亲謱R時,取值范圍1020~1020 字節(jié)之間。對于基于PC相對偏移的地址值時,給定范圍是相對當(dāng)前指令地址后兩個字(四個字節(jié))處。ADR 偽指令舉例如下;LOOP MOV R1,0xF0 … ADR R2,LOOP ;將 LOOP 的地址放入 R2 ADR R3,LOOP+4 可以用ADR加載地址,實現(xiàn)查表:…ADR R0,DISP_TAB ;加載轉(zhuǎn)換表地址LDRB R1,[R0,R2] ;使用 R2 作為參數(shù),進(jìn)行查表… DISP_TABDCB 0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90◆ ADRL中等范圍的地址讀取偽指令。ADRL 指令將基于 PC 相對偏移的地址值或基于寄存器對偏移的地址值讀取到寄存器中,比 ADR 偽指令可以讀取更大范圍的地址。在匯編編譯源程序時,ADRL 偽指令被編譯器替換成兩個條合適的指令。若不能用兩條指令實現(xiàn)ADRL 偽指令功能,則產(chǎn)生錯誤,編譯失敗。ADRL 偽指令格式如下: ADR{cond} register,exper其中,register 加載的目標(biāo)寄存器,expr地址表達(dá)式。當(dāng)?shù)刂分凳欠亲謱R時,取范圍64K~64K 字節(jié)之間;當(dāng)?shù)刂分凳亲謱R時,取值范圍256K~256K字節(jié)之間。ADRL 偽指令舉例如下; ADRL R0,DATA_BUF … ADRL R1,DATA_BUF+80 …DATA_BUF SPACE 100 ;定義 100 字節(jié)緩沖區(qū)可以使用 ADRL 加載地址,實現(xiàn)程序跳轉(zhuǎn),中等范圍地址的加載。 … ADR LR,RETURNI ;設(shè)置返回地址 ADRL R1 Thumb_Sub+1;取得了 Thumb 子程序入口地址,且R1的0位置1 BX R1 ;調(diào)用 Thumb 子程序,并切換處理器狀態(tài)RETURNI … CODE16 Thumb_Sub MOV R1,10 …◆ LDR大范圍的地址讀取偽指令。LDR 偽指令用于加載 32 位的立即數(shù)或一個地址值到指定寄存器。在匯編編譯源程序時,LDR 偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入字池,并使用一條程序相對偏移的LDR指令從文字池讀出常量。LDR 偽指令格式如下:LDR{cond} register,=expr/label_expr其中,register加載的目標(biāo)寄存器 expr的32位立即數(shù)。label_expr基于PC的地址表達(dá)式或外部表達(dá)式。LADR 偽指令舉例如下:LDR R0,=0x123456 ;加載 32 位立即數(shù) 0x12345678LDR R0,=DATA_BUF+60 ;加載 DATA_BUF 地址+60…LTORG ;聲明文字池偽指令 LDR 常用于加載芯片外圍功能部件的寄存器地址(32 位立即數(shù)),以實現(xiàn)各種控制操作加載 32 位立即數(shù)?!璍DR R0,=IOPIN ;加載 GPIO 寄存器 IOPIN 的地址LDR R1,[R0] ;讀取 IOPIN 寄存器的值…LDR R0,=IOSETLDR R1,=0x00500500STR R1,[R0] ;IOSET=0x00500500…從 PC 到文字池的偏移量必須小于4KB與 ARM 指令的LDR相比,偽指令的 LDR 的參數(shù)有“=”號?!?NOP空操作偽指令。NOP 偽指令在匯編時將會被代替成 ARM 中的空操作,比如可能為 MOV,R0,R0 指令等,NOP 偽指令格式如下:NOP 可用于延時操作。軟件延時… DELAY1NOP NOP NOPSUBS R1,R1,1 BNE DELAY1…Thumb 指令集Thumb 指令可以看作是 ARM 指令壓縮形式的子集,是針對代碼密度的問題而提出的,它具有 16 位的代碼密度。Thumb 不是一個完整的體系結(jié)構(gòu),不能指望處理只執(zhí)行 Thumb 指令而不支持ARM 指令集。因此,Thumb 指令只需要支持通用功能,必要時可以借助于完善的 ARM 指令集,比如,所有異常自動進(jìn)入 ARM 狀態(tài)。在編寫 Thumb 指令時,先要使用偽指令 CODE16 聲明,而且在 ARM 指令中要使用 BX 指令跳轉(zhuǎn)到 Thumb 指令,以切換處理器狀態(tài)。編寫 ARM 指令時,則可使用偽指令 CODE32 聲明。Thumb 指令集與 ARM 指令集的區(qū)別Thumb 指令集沒有協(xié)處理器指令,信號量指令以及訪問 CPSR 或 SPSR 的指令,沒有乘加指令及 64 位乘法指令等,且指令的第二操作數(shù)受到限制;除了跳轉(zhuǎn)指令 B 有條件執(zhí)行功能外,其它指令均為無條件執(zhí)行;大多數(shù) Thumb 數(shù)據(jù)處理指令采用 2 地址格式。Thumb 指令集與 ARM 指令的區(qū)別一般有如下幾點:跳轉(zhuǎn)指令程序相對轉(zhuǎn)移,特別是條件跳轉(zhuǎn)與 ARM 代碼下的跳轉(zhuǎn)相比,在范圍上有更多的限制,轉(zhuǎn)向子程序是無條件的轉(zhuǎn)移。數(shù)據(jù)處理指令數(shù)據(jù)處理指令是對通用寄存器進(jìn)行操作,在大多數(shù)情況下,操作的結(jié)果須放入其中一個操作數(shù)寄存器中,而不是第 3 個寄存器中。數(shù)據(jù)處理操作比 ARM 狀態(tài)的更少,訪問寄存器R8~R15 受到一定限制。除 MOV 和 ADD 指令訪問器 R8~R15 外,其它數(shù)據(jù)處理指令總是更新 CPSR 中的 ALU 狀態(tài)標(biāo)志。訪問寄存器 R8~R15 的 Thumb 數(shù)據(jù)處理指令不能更新 CPSR 中的 ALU狀態(tài)標(biāo)志。單寄存器加載和存儲指令在 Thumb 狀態(tài)下,單寄存器加載和存儲指令只能訪問寄存器 R0~R7。批量寄存器加載和存儲指令LDM 和 STM 指令可以將任何范圍為 R0~R7 的寄存器子集加載或存儲。PUSH 和 POP 指令使用堆棧指令 R13 作為基址實現(xiàn)滿遞減堆棧。除 R0~R7 外,PUSH 指令還可以存儲鏈接寄存器 R14,并且 POP 指令可以加載程序指令 PC。Thumb 存儲器訪問指令Thumb 指令集的LDM和SRM指令可以將任何范圍為R0~R7的寄存器子集加載或存儲。批量寄存器加載和存儲指令只有LDMIA,STMIA指令,即每次傳送先加載/存儲數(shù)據(jù)
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1