linux嵌入式-國嵌4-7chapter1.ARM處理器尋址方式_第1頁
linux嵌入式-國嵌4-7chapter1.ARM處理器尋址方式_第2頁
linux嵌入式-國嵌4-7chapter1.ARM處理器尋址方式_第3頁
linux嵌入式-國嵌4-7chapter1.ARM處理器尋址方式_第4頁
linux嵌入式-國嵌4-7chapter1.ARM處理器尋址方式_第5頁
已閱讀5頁,還剩199頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4ARM7TDMI(-S)簡ARM處理器是基于精簡指令集計算機(RISC)原理設計的,指令集和相關譯碼機制較為簡單。指令集,ARM指令集效率高,但是代碼密度低;而Thumb指令集具有較高的代碼密度,卻仍然保持ARM的大多數(shù)性能上的優(yōu)勢,它是ARM指令集的程序和Thumb程序可相用,相互之間的狀態(tài)切第4ARM7TDMI(-S)ARM指令集與Thumb指令集的關ARM處理器尋址方尋址方式分尋址方式是根據(jù)指令中給出的地址碼字段來實現(xiàn)尋找真作數(shù)地址的方式。ARM處理器具有9 3.寄存器移位尋址 4.寄存器間接尋址5.基址尋址 6.多寄存器尋址7.堆棧尋址 8.塊拷貝尋址ARM處理器尋址方尋址方式分類——寄存器尋的是寄存器 SUB 到MOVARM處理器尋址方尋址方式分類——立即尋這B 這BMOVMOV

從代碼中獲得數(shù)據(jù)MOVARM處理器尋址方尋址方式分類——寄存器移位尋寄存器移位尋址是ARM當?shù)?個操作數(shù)是寄存器移位方式時,第2。VD。VD MOVR0,R2,LSLARM處理器尋址方尋址方式分類——寄存器間接尋寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的,所需的操作數(shù)保存在寄存器指 。R。RPLDRARM處理器尋址方尋址方式分類——基址尋基址尋址就是將基址寄存器的內容與指令中給出的偏移量相加,形成操作數(shù)的有效地址。基址尋 RLDR據(jù)LDRARM處理器尋址方尋址方式分類——多寄存器尋器LDRR1!,{R2-MM0x4000000x400000ARM處理器尋址方尋址方式分類——堆棧尋堆棧是一個按特定順序進行存取的區(qū),操作順序為“后進先出”。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊區(qū)域(堆棧),指針所指向的單元即是堆棧的棧頂。ARM處理器尋址方尋址方式分類——堆棧尋增堆棧壓增堆棧壓增堆棧壓堆棧棧 儲 棧棧 棧頂ARM處理器尋址方尋址方式分類——堆棧尋壓SP→棧SP→壓SP→棧SP→棧棧棧壓滿滿堆空堆ARM處理器尋址方尋址方式分類——堆棧尋滿遞增:堆棧向上增長,堆棧指針指向內含有效數(shù)據(jù)項的最高地址。指令如LDMFA、STMFA空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如LDMEA、STMEA滿遞減:堆棧向下增長,堆棧指針指向內含有效空遞減:堆棧向下增長,堆棧指針向堆棧下的第ARM處理器尋址方尋址方式分類——塊拷貝尋多寄存器傳送指令用于將一塊數(shù)據(jù) 器STMIAR0!,{R1-R7};將R1~R7的數(shù)據(jù)保存 ;增長方向為向上增STMIBR0!,{R1-R7};將R1~R7的數(shù)據(jù)保存 ARM處理器尋址方尋址方式分類——相對尋相對尋址是基址尋址的一種變通。由程序計數(shù)量,兩者相加后得到的地址即為操作數(shù)的有效地址。;調用到SUBR1子程;條件跳轉到LOOP標號第42. 現(xiàn)兩 器明簡單的ARM程 現(xiàn)兩 器明 使用“;”進行注 仿真調 Example1,CODE,READONLY;代碼段 START 實際代碼 ADD_SUB標號頂格 ;R0=R0+ 文件結簡單的ARM程 Example1,CODE,READONLY; 代碼段 START

;R0=R0+ 第42.ARM指令 指ARMARM指令 指ARM指令集介ARM指令集——指令格<opcode><opcode>{<cond>} <Rd>其中<>號內的項是必須的,{}號內的項是可選的。S:是否影響CPSR寄存器的值Rd:目標寄存器Rn:第1個操作數(shù)的寄存器指令集介ARM指令集——第2個操作<opcode><opcode>{<cond>} <Rd>靈活的使用第2個操作數(shù)“operand2”能夠提高代指令集介ARM指令集——第2個操作該常數(shù)必須對應8位位圖,即一個8位的常數(shù)通過循環(huán)右移10000000000000000000000000000100108位常00000100100000000000000000000000指令集介ARM指令集——第2個操作該常數(shù)必須對應8位位圖,即一個8位的常數(shù)通過 指令集介ARM指令集——第2個操作 指令集介ARM指令集——第2個操作將寄存器的移位結果作為操作數(shù),但RmASRRORLSL邏輯左移n帶擴展的循環(huán)右移1LSR邏輯右移nType指令集介ARM指令集——第2個操作00ASR移位操作00CRRX移位操作C指令集介ARM指令集——第2個操作R1,R1,R1,LSLR1,R1,R2,LSR;R1=R1-ARM指令 指ARM指令集介ARM指令集——條件<opcode><opcode>{<cond>} <Rd>使用條件碼“cond”可以實現(xiàn)高效的邏輯所有的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉)指令具有條件執(zhí)行功能。如果指令不標指令條件碼無條件執(zhí)行(指令默認條件指令集介ARM指令集——條件C代碼C代碼If(a>對應的匯編代碼ADDHIADDLS;R0與R1比;若R0>R1,則;若R0≤1,則ARM指令 指ARM指令集介ARM指令集— 指ARM處理器是典型的RISC處理器,對器的只能使用加載和指令實現(xiàn)。ARM 結構,程序空間、RAM空間及I/O映射空間統(tǒng)一編址,除對RAM操作以外,對IO、程序數(shù)據(jù)的均要通過加載/指令進行。器指令分為單寄存器操作指令和存器操作指令 指令——單寄存器加 LDRBTRd, Rd,LDRSBRd,LDRSHRd, 指令——單寄存 Rd, 以用戶模式字據(jù) 以用戶模式字節(jié) [addressing]LDR/STR指令用于對內存變量的 、內存緩沖區(qū)數(shù)據(jù)的 、查表、部件的控制操作等。若使用LDR指令加載數(shù)據(jù)到PC寄存器,則實現(xiàn)程序跳轉功能,這樣也就實現(xiàn)了程序 指令” 指令——單寄存LDR和STR——字和無符號字節(jié)加載/指令LDR指令用于從內存中單一字或字節(jié)數(shù)據(jù)存入寄存器中,STR指令用于將寄存器中的單一字Rd,<地址;將指定地址上的字數(shù)據(jù)讀入Rd,<地址;將Rd中的字數(shù)據(jù)存入指定地Rd,<地址;將指定地址上的字節(jié)數(shù)據(jù)讀入Rd,<地址;將Rd中的字節(jié)數(shù)據(jù)存入指定地理器是在模式下,系統(tǒng)也將看成是在用戶模式下進行的。T在用戶模式下無效,不能與W表示回Rn為基址寄存位立W表示回Rn為基址寄存位立即數(shù),為1時,偏移量為寄存器移為指令的尋址方Rd為源/目標寄存U表示 (L為或L用于區(qū)別加載(L為(L為或L用于區(qū)別加載(L為為0表示B為1表示字指令執(zhí)行的條件P表示前/后變 指令——單寄存 LDR/STR指令尋址非常靈活,它由兩部分組成,其中一部分為一個基址寄存器,可以為任一個通用寄存器;另一部分為一個地址偏移量。地址偏移量有以下3種格式:立即數(shù)。立即數(shù)可以是一個無符號的數(shù)值。這個數(shù)據(jù)可以到基址寄存器,也可以從基址寄存器中減去這個如:LDR寄存器。寄存器中的數(shù)值可以加到基址寄存器,也可以從址寄存器中減去這個數(shù)如:LDR寄存器及移位常數(shù)也可以從基址寄存器中減去這個數(shù)如:LDRR1,[R0,R2,LSL 指令——單寄存 從尋址方式的地址計算方法分,加載 指令有以下種格式零偏移如前索引偏移如程序相對偏移如后索引偏移如注意:大多數(shù)情況下,必須保證字數(shù)據(jù)操作的地址是32位齊的 指令——單寄存 這類LDR/STR指令可加載有符號半字或字節(jié),可加載/存儲無符號半字。偏移量格式、尋址方式與加載/字和無符號字節(jié)指令相同。Rd,<地址;將指定地址上的有符號字節(jié)讀入Rd,<地址;將指定地址上的有符號半字讀入Rd,<地址;將指定地址上的半字數(shù)據(jù)讀入Rd,<地址;將Rd中的半字數(shù)據(jù)存入指定地注意有符號位半字/字節(jié)加載是指用符號位加載擴展到32符號半字加載是指用零擴展到32位半字讀寫的指定地址必須為偶數(shù),否則將產生不可靠的結果(L為或L用于區(qū)別加載(L為Rn為基址寄存U表示加(L為或L用于區(qū)別加載(L為Rn為基址寄存U表示加位立即數(shù),為1時,偏移量為寄存器移為指令的尋址方Rd為源/目標寄存指令執(zhí)行的條件P表示前/后變?yōu)?表示無符,指令執(zhí)行的條件P表示前/后變?yōu)?表示無符,H為1表示半0表示字W表示W表示回S為1表示有符, 指令——單寄存LDR和STR加載 字和無符號字節(jié)指 R1,[R0,#0x04];將R1的數(shù) 到R0+0x04地 加載 半字和有符號字節(jié)指LDRSB ;高24位用符號擴 ;將R2指向地址的半字數(shù)據(jù)存入R6,高16位用0擴;讀出后 R1,[R0,#2]!;將R1的半字數(shù)據(jù)保存到R0+2 指令——多寄存器存LDM{mode}STM{mode}[Rn...]←reglist,Rn多寄存器加載/ 指令可以實現(xiàn)在一組寄存器和一塊連續(xù)的內存單元之間傳輸數(shù)據(jù)。LDM為加載多個寄存器;STM為 多個寄存器。允許一條指令傳送16個寄存器的任何子集或所有寄存器。它們主要用于現(xiàn)場保護、數(shù)據(jù) 、常數(shù)傳遞等。 指令——多寄存器存多寄存器加載 指令格式如下LDM{cond}<模式STM{cond}<模式cond:指令執(zhí)行的條件模式:控制地址的增長方式,一共有8種模式!:表示在操作結束后,將最后的地址寫回Rn中reglist:表示寄存器列表,可以包含多個寄存器,它們使用“,”隔開{R1,R2,R6-R9},寄存器由小到大排列^:加入該后綴后,進行數(shù)據(jù)傳送且寄存器列表不包含PC時,加的寄存器是用戶模式下的,而不是當前模式的寄存器。若在LDM指令且寄存器列表中包含有PC時使用,那么除了正常的多寄存器傳送外,還將SPSR也拷貝到CPSR中,這可用于異常處理返回。注意:該后綴不允許在用戶模式或系統(tǒng)模式下使用。(L為或L用于區(qū)別加載(L為Rn為基址寄存寄存(L為或L用于區(qū)別加載(L為Rn為基址寄存寄存器列P表示前/后變U表示加 指令執(zhí)行的條件S對應于指令中的”^”符W表示回 指令——多寄存器存多寄存器加載 指令的8種模式如下表所示,右邊四種為堆操作、左邊四種為數(shù)據(jù)傳送操作每次傳送后地址加每次傳送后地址減每次傳送前地址減進行數(shù) 時,先設置好源數(shù)據(jù)指針和目標指針,然后使用拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDALDMDB/STMDB進 進行堆棧操作操作時,要先設置堆棧指針(SP),然后使用堆尋址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFASTMEA/LDMEA實現(xiàn)堆棧操作 指令——多寄存器存數(shù)據(jù)塊傳送指令操作過程如右圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1’則為指令執(zhí)行后的基址

R1’R1

R1’R1

指令STMIAR1!,{R5- 指令STMIBR1!,{R5-R1R1’

R1

→指令STMDAR1!,{R5- 指令STMDBR1!,{R5-......堆棧操作(詳見 尋址方式堆棧尋址”)和數(shù)據(jù)塊傳送指類似,也有4種模式,它們之間的關系如下表所兩段代碼的執(zhí)行結果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡單(只要前后一致即可),而使用數(shù)據(jù)塊指令進行壓棧 器交換指 寄存器和器字Rd←[Rn],[Rn]←Rm(Rn≠Rd或 寄存器和器字Rd←[Rn],[Rn]←Rm(Rn≠Rd或SWP指令用于將一個內存單元(該單元地址放在寄存器Rn中)的內容讀取到一個寄存器Rd中,同時將另一個寄存器Rm的內容寫入到該內存單元SW指令格式如下 其中,B為可選后綴,若有B,則交換字節(jié),否則交換2位字;Rd用于保存從器中讀入的數(shù)據(jù);Rm的數(shù)據(jù)用于到器中,若Rm與Rn相同,則為寄存器與器內容進行交換;Rn為要進行 的器RnRm相。 器交換指 Rn為基址寄存指令執(zhí)行Rn為基址寄存指令執(zhí)行的條件B用于區(qū)別無符號字節(jié)(B為1)或字(BRm源寄存Rd目標寄存 ;將R0指向 單元內的 ARM指令 指ARM指令集介ARM指令集——ARM數(shù)據(jù)處理指數(shù)據(jù)處理指令大致可分為3數(shù)據(jù)處理指令只能對寄存器的內容進行操作,ARM數(shù)據(jù)處理指令——指令編第二操作指令執(zhí)行的條件第二操作指令執(zhí)行的條件操作指令助說邏輯與操作指邏輯異或操作指減法運算指逆向減法指加法運算指帶進位加存帶進位減法指與指令帶進位逆向減法指位測試指相等測試指比較指負數(shù)比較指邏輯或操作指數(shù)據(jù)傳位清除指數(shù)據(jù)非傳I用于區(qū)別立即數(shù)為1)和寄存器移位(I為opcode數(shù)據(jù)處理指令操作ARM數(shù)據(jù)處理指令——數(shù)據(jù)傳 ARM數(shù)據(jù)處理指令——數(shù)據(jù)傳 MOV指令將8位圖立即數(shù)(參“第操作數(shù):#immed_r——常數(shù)表式 ”或寄存器傳送到標寄存器d,可用于位運算等操作。指令格式如下: MOV指令舉例如下;R3=R1<<2,并影響標志;PC=LR,子程序返ARM數(shù)據(jù)處理指令——數(shù)據(jù)傳 MVN指令將8位圖立即數(shù)(參看“第2操作數(shù):#immed_8r——常表達 ”)或寄存器(operand2)按位取反后傳送到目標寄存(Rd),因為其具有取反功能,所以可以裝載范圍更廣的立即數(shù)。指令式如下 MVN指令舉例如下;將R2取反,結果存到ARM數(shù)據(jù)處理指令——算術運Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,ARM數(shù)據(jù)處理指令——算術運Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,加法運算指令——DD指令將opernd2的值與n的值相加,結果保存到寄存器。指令格式如下: 應用示例 ;R1=R1+1,并影響標志 減法運算指令——SUB指令用寄存器Rn減去operand2,結果保存減法運算指令——SUB指令用寄存器Rn減去operand2,結果保存到中。指令格式如下應用示例Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,;R0=R0-1,并影響標志;R2=R1-R2,并影響標志逆向減法運算指令——RSB指令將operand2的值減去RnRd中。指令逆向減法運算指令——RSB指令將operand2的值減去RnRd中。指令格式如下應用示例Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,;R3=0xFF00-R1,R2,R2,LSL;R1=(R2<<2)-ARM數(shù)據(jù)處理指令——算術運Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,帶進位加法指令——ADC將operand2的值與Rn的值相加,再加上 應用示例(使用ADC實現(xiàn)64位加法,結果存于R1、R0中;R0等于低32位相加,并影響標志;R1等于高32位相加,并加上低位進ARM數(shù)據(jù)處理指令——算術運Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,帶進位減法指令——SBC用寄存器Rn減去operand,再減去CPSR中的C條件標志位的非(即若C標志清零,則結果減去1),結果保存到Rd中。指令格式如下: 應用示例(使用SBC實現(xiàn)64位減法,結果存于R1、R0中;低32位相減,并影響標志;高32位相減,并減去低位借ARM數(shù)據(jù)處理指令——算術運Rd,Rn,Rd,Rn,Rd←Rn-Rd,Rn,Rd,Rn,Rd,Rn,Rd,Rn,帶進位逆向減法指令——RSC指令用寄存器operand2減去Rn,再減CPSR中的C條件標志位,結果保存到Rd中。指令格式如RSC{cond}{S}Rd,Rn,operand2應用示例(使用RSC指令實現(xiàn)求64位數(shù)值的負數(shù)):RSBSR2,R0,#0RSCARM數(shù)據(jù)處理指令——邏輯運算指Rd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←RnARM數(shù)據(jù)處理指令——邏輯運算指Rd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←Rn邏輯與操作指令——AND指令將operand2的值與寄存器Rn的值按位作邏輯“與”操作,結果保存到Rd中。指令格式如下 應用示例;R0=R0&0x01,取出最低位數(shù)ARM數(shù)據(jù)處理指令——邏輯運算指Rd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←Rn邏輯或操作指令——ORR指令將operand2的值與寄存器Rn的值按位邏輯“或”操作,結果保存到Rd中。指令格式如下 Rd,Rn,應用示例 ;將R0的低4位置R1,R2,LSRR3,R1,R3,LSL;使用ORR指令將R2的高8;數(shù)據(jù)移入到R3低8位邏輯異或操作指令——EOR指令將operand2的值與邏輯異或操作指令——EOR指令將operand2的值與寄存器Rn作邏輯“異或”操作,結果保存到Rd中。指令格式如Rd,Rn,應用示例Rd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←Rn;將R1的低4位取;將R5和0x01進行邏輯異或;結果保存到R0,并影響標志ARM數(shù)據(jù)處理指令——邏輯運算指Rd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←RnRd,Rn,Rd←Rn位清除指令——BIC指令將寄存器Rn的值與operand2的值的反碼按作邏輯“與”操作,結果保存到Rd中。指令格式如下 Rd,Rn,應用示例 ;將R1的低4位清零,其它位不 ;將R3的反碼和R2相邏輯“與;結果保存到R1ARM數(shù)據(jù)處理指令——比較指 Rn,標志N、Z、C、V←Rn- Rn,標志N、Z、C、 Rn,標志N、Z、C、V←Rn Rn,標志N、Z、C、V←RnARM數(shù)據(jù)處理指令——比較指 Rn,標志N、Z、C、V←Rn- Rn,標志N、Z、C、 Rn,標志N、Z、C、V←Rn Rn,標志N、Z、C、V←Rn比較指令——CMP指令將寄存器n的值減去operand的值,根據(jù)操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。指令格式如下: Rn,應用示例 ;R1與10比較,設置相關標志 ;R1與R2比較,設置相關標志ARM數(shù)據(jù)處理指令——比較指 Rn,標志N、Z、C、V←Rn- Rn,標志N、Z、C、 Rn,標志N、Z、C、V←Rn Rn,標志N、Z、C、V←Rn比較指令——CMP指令將寄存器n的值減去operand的值,根據(jù)操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。指令格式如下: Rn,注意:CMP指令與SBS指令的區(qū)別在于CM指令不保存運算結果。在進行兩個數(shù)據(jù)的大小判斷時,常用CM指令及相應的條件碼來操作。ARM數(shù)據(jù)處理指令——比較指 Rn,標志N、Z、C、V←Rn- Rn,標志N、Z、C、 Rn,標志N、Z、C、V←Rn Rn,標志N、Z、C、V←Rn負數(shù)比較指令——CMN指令使用寄存器Rn的值加上operand2的值,根據(jù)操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。指令格式如下: Rn,應用示例 ;R0+1,判斷R0是否為1的補;如果是,則設置Z標志ARM數(shù)據(jù)處理指令——比較指 Rn,標志N、Z、C、V←Rn- Rn,標志N、Z、C、 Rn,標志N、Z、C、V←Rn Rn,標志N、Z、C、V←Rn負數(shù)比較指令——CMN指令使用寄存器Rn的值加上operand2的值,根據(jù)操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。指令格式如下: Rn,注意:CMN指令與ADDS指令的區(qū)別在于CMN指令不保存運算結果。CMN指令可用于負數(shù)比較,比如CMNR0,#1指令則表示R0與-1比較,若ARM數(shù)據(jù)處理指令——比較指 Rn,標志N、Z、C、V←Rn- Rn,標志N、Z、C、 Rn,標志N、Z、C、V←Rn Rn,標志N、Z、C、V←Rn位測試指令——TST指令將寄存器Rn的值與operand2的值按位作邏輯“與”操作,根據(jù)操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。指令格式如下: Rn,應用示例 ;判斷R0的最低位是否為 ;判斷R1的低4位是否為ARM數(shù)據(jù)處理指令——比較指 Rn,標志N、Z、C、V←Rn- Rn,標志N、Z、C、 Rn,標志N、Z、C、V←Rn Rn,標志N、Z、C、V←Rn位測試指令——TST指令將寄存器Rn的值與operand2的值按位作邏輯“與”操作,根據(jù)操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。指令格式如下: Rn,注意:TST指令與NDS指令的區(qū)別在于TST指令不保存運算結果。TST指令通常與EQ、NE條件碼配合使用,當所有測試位均為0時,EQ有效,而只要有一個測試位不為0,則NE有效。ARM數(shù)據(jù)處理指令——比較指 Rn,標志N、Z、C、V←Rn- Rn,標志N、Z、C、 Rn,標志N、Z、C、V←Rn Rn,標志N、Z、C、V←Rn相等測試指令——TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,根據(jù)操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。指令格式如下: Rn,應用示例 ;比較R0與R1是否相等(不影響V位和C位ARM數(shù)據(jù)處理指令——比較指 Rn,標志N、Z、C、V←Rn- Rn,標志N、Z、C、 Rn,標志N、Z、C、V←Rn Rn,標志N、Z、C、V←Rn相等測試指令——TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,根據(jù)操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。指令格式如下: Rn,注意:TEQ指令與EORS指令的區(qū)別在于TEQ指令不保存運算結果。使用TEQ進行相等測試時,常與EQ、NE條件碼配合使用。當兩個數(shù)據(jù)相等時,ARM指令 指ARM指令集介ARM指令集——乘法指ARM7TDMI32×3232323232位結果為64ARM指令——乘法指Opcode乘Opcode乘法指令操作Rm為被乘數(shù)寄存指令執(zhí)行的條件opcode操s碼功指令執(zhí)行的條件S設置條件碼,與指令中的S位對

操作

指令助記

說令32位乘法指 相令32位乘加指 乘器或64位乘法指令的目標寄存器(

64位無符號乘法指令(64位無符號乘加指64位有符號乘法指64位有符號乘加指ARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLALARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLAL32位乘法指令——MUL指令將Rm和Rs中的值相乘,結果的低32位保存到中。指令格式如下: 應用示例;R0=R3×R7,同時影響CPSR中的N位和ZARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLAL32位乘加指令——MLA指令將Rm和Rs中的值相乘,再將乘積加上第個操作數(shù),結果的低32位保存到Rd中。指令格式如 應用示例 ;ARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLAL64位無符號乘法指令——UMULL指令將Rm和Rs中的值作無符號數(shù)相乘,結果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下: 應用示例 (R1、ARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLAL64位無符號乘加指令——UMLAL指令將Rm和Rs中的值作無符號數(shù)相乘,64位乘積與RdHi、RdLo相加,結果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下: 應用示例 ;(R1、R0)=R5×R8+(R1、ARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLAL64位有符號乘法指令——SMULL指令將Rm和Rs中的值作有符號數(shù)相乘,結果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下: 應用示例 (R3、ARM指令——乘法指 32Rd←Rm*Rs 32Rd←Rm*Rs+RnUMULL(RdLo,RdHi)UMLALSMULL(RdLo,RdHi)SMLAL64位有符號乘加指令——SMLAL指令將Rm和Rs中的值作有符64位乘積與RdHi、RdLo相加,結果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下: 應用示例 ;(R3、R2)=R7×R6+(R3、ARM指令 指ARM4.2指令集介ARM指令集——分支指寄存器賦值實現(xiàn)跳轉。分支指令有以下三種: 帶狀態(tài)切換的分支指令BXARM分支指令——指令編指指令執(zhí)行的條件24位有符號立即(偏移量L區(qū)別B指令(L為0)指令指令執(zhí)行的條件Rm目標地址寄存器,ARM指令——分支指 帶的分支指LR←PC- ARM指令——分支指 帶的分支指LR←PC- 分支指令——B指令,該指令跳轉范圍限制在當前指令的±32M字節(jié)地址內(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下 應用示例 ;跳轉到WAITA標號 ;跳轉到絕對地址0x1234ARM指令——分支指 帶的分支指LR←PC- 帶的分支指令——BL指令適用于子程序調用,使用該指令后,下一條指令的地址被拷貝到R14(即LR)連接寄存器中,然后跳轉到指定地址運 BL2.程序跳轉到目標地址BL2.程序跳轉到目標地址 MOVMOVARM指令——分支指 帶的分支指LR←PC- 帶的分支指令——BL指令適用于子程序調用,使用該指令后,下一條指令的地址被拷貝到R14(即LR)連接寄存器中,然后跳轉到指定地址運 應用示例 用子程序ARM指令——分支指 帶的分支指LR←PC- 帶狀態(tài)切換的分支指令——BX指令,該指令可以根據(jù)跳轉地址(Rm)的最低位來切換處理器狀態(tài)。其跳轉范圍限制在當前指令的±32M字節(jié)地址內(RM指令為字對齊,最低20)。指令格式如下: 0011ARM指令——分支指 帶的分支指LR←PC- 帶狀態(tài)切換的分支指令——BX指令,該指令可以根據(jù)跳轉地址(Rm)的最低位來切換處理器狀態(tài)。其跳轉范圍限制在當前指令的±32M字節(jié)地址內(RM指令為字對齊,最低20)。指令格式如下: 應用示例 R0,ThumbFun+1;將Thumb程序 地址加1存入 ;跳轉到R0指定的地址;并根據(jù)R0的最低位來切換處理器狀ARM指令 指ARM4.2指令集介ARM指令集——協(xié)處理器指協(xié)處理器協(xié)處理器…ARM內核協(xié)處理器協(xié)處理器…ARM指令——協(xié)處理器指 coprocCRd,協(xié)處理器數(shù)據(jù)指 coprocCRd, ARM 協(xié)處理器寄存器到ARMARM協(xié)處理器指令——數(shù)據(jù)操作指RM處理器通過CDP指令通知ARM協(xié)處理器執(zhí)行特定的操作。該操作由協(xié)處理器完成,即對命令的參數(shù)的解釋與協(xié)處理器有關,指令的使用取決于協(xié)處理器。若協(xié)處理器不能成功地執(zhí)行該操作,將產生未定義指令異DPcd的協(xié)處

放第1個源操作數(shù){,pcde存放第2個源操作數(shù) 數(shù)據(jù)操作指令編ARM協(xié)處理器指令——數(shù)據(jù)操作指RM處理器通過CDP指令通知ARM協(xié)處理器執(zhí)行特定的操作。該操作由協(xié)處理器完成,即對命令的參數(shù)的解釋與協(xié)處理器有關,指令的使用取決于協(xié)處理器。若協(xié)處理器不能成功地執(zhí)行該操作,將產生未定義指令異應用示例 ;對協(xié)處理器7操作,操作碼為;可選操作碼為 ;對協(xié)處理器6操作,操作碼為 ARM協(xié)處理器指令——數(shù)據(jù)存取指協(xié)處理器數(shù)據(jù)存取指令LDC/STC指令可以將某一連續(xù)內存單元的數(shù)據(jù)到協(xié)處理器的寄存器中,或者將協(xié)處理器的寄存器數(shù)據(jù)寫入到某一連續(xù)的內存單元中,傳送的字數(shù)由協(xié)處理器來控制。若協(xié)處理器不能成功執(zhí)行該操作,將產生未定義指令異 coproc,CRd,<地址數(shù) coproc,CRd,<地址 coproc,CRd,<地址數(shù) coproc,CRd,<地址ARM協(xié)處理器指令——數(shù)據(jù)存取指協(xié)處理器數(shù)據(jù)存取指令LDC/STC指令可以將某一連續(xù)內存單元的數(shù)據(jù)到協(xié)處理器的寄存器中,或者將協(xié)處理器的寄存器數(shù)據(jù)寫入到某一連續(xù)的內存單元中,傳送的字數(shù)由協(xié)處理器來控制。若協(xié)處理器不能成功W執(zhí)行該操作,將產生未定義指令異W8P數(shù)據(jù)操作指令編8PL(為0)還是寫入協(xié)處理器中的目標ARM協(xié)處理器指令——數(shù)據(jù)存取指協(xié)處理器數(shù)據(jù)存取指令LDC/STC指令可以將某一連續(xù)內存單元的數(shù)據(jù)到協(xié)處理器的寄存器中,或者將協(xié)處理器的寄存器數(shù)據(jù)寫入到某一連續(xù)的內存單元中,傳送的字數(shù)由協(xié)處理器來控制。若協(xié)處理器不能成功執(zhí)行該操作,將產生未定義指令異數(shù)據(jù)操作指令編應用示例 R2+4指向的內存單元的數(shù);傳送到協(xié)處理器p5的c2寄存器 ;將協(xié)處理器p5的C1寄存器內數(shù);傳送到R0指向的內存單ARM協(xié)處理器指令——寄存器傳送指如果需要在ARM處理器中的寄存器與協(xié)處理器中的寄存器之間進行數(shù)據(jù)傳送,那么可以使用M RC指令。MC指令用于將ARM處理器的寄存器中的數(shù)據(jù)傳送到協(xié)處理器的寄存器。MRC指令用于將協(xié)處理器的寄存器中的數(shù)據(jù)傳送到ARM處理器的寄存器中。若協(xié)處理器不能成功地執(zhí)行該操作,將產生未定義指令異常中。 MCR指令格式(ARM→協(xié) MRC指令格式(協(xié)處理器→ 存放第1個操作數(shù)的可選的協(xié)處理器特ARM協(xié)處理器指令——寄存器存放第1個操作數(shù)的可選的協(xié)處理器特如果需要在ARM處理器中的寄存器與協(xié)處理器中的寄存器之間進行數(shù)據(jù)傳送,那么可以使用M RC指令。MC指令用于將ARM處理器的寄存器中的數(shù)據(jù)傳送到協(xié)處理器的寄存器。MRC指令用于將協(xié)處理器的寄存器中的數(shù)據(jù)傳送到ARM處理器的寄存器中。若協(xié)處理器不能成功地執(zhí)行該操作,將產生未定義指令異常中。存放第2個操作數(shù)寄存器傳送指存放第2個操作數(shù)L表示數(shù)據(jù)是傳入ARM(為0)還是傳ARM協(xié)處理器指令——寄存器傳送指如果需要在ARM處理器中的寄存器與協(xié)處理器中的寄存器之間進行數(shù)據(jù)傳送,那么可以使用M RC指令。MC指令用于將ARM處理器的寄存器中的數(shù)據(jù)傳送到協(xié)處理器的寄存器。MRC指令用于將協(xié)處理器的寄存器中的數(shù)據(jù)傳送到ARM處理器的寄存器中。若協(xié)處理器不能成功地執(zhí)行該操作,將產生未定義指令異常中。寄存器傳送指令編應用示例;將ARM中的R7寄存器內容傳;到協(xié)處理器6的C1和C2寄存;將協(xié)處理器5的C3和C2寄存;內容傳遞到ARM中的R2寄存ARM指令 指ARM4.2指令集介ARM指令集——雜項指 ARM雜項指令——軟中斷指SWI指令用于產生軟中斷,從而實現(xiàn)在從戶模式變換到管理模式,并且將CPSR保存到管理模式的SPSR中,然后程序跳轉到SWI異常。在其它模式下也可使用SW指令,處理器同樣地切換到管理模式。該指令主要用于用戶程序調用操作系統(tǒng)的系統(tǒng)服務,操作系統(tǒng)在SWI異常處理程序中進行相應的系統(tǒng)服務。SWI指令格 SWI指令編指令傳遞的參數(shù)(24位立即數(shù)指令傳遞的參數(shù)(24位立即數(shù)ARM雜項指令——軟中斷指根據(jù)SWI指令傳遞的參數(shù)SWI異常處理程序可以作出相應的處理。SWI指令傳遞參數(shù)有以下兩種方法,指令中的24器傳遞 ;設置子功能號為 ;調用12號軟中指令中的24位立即數(shù)被忽略,用戶請求的服務類型由寄存器R0的值決定,參數(shù)通過其它的通用寄存器傳遞。;調用12號軟中;設置子功能號為0ARM雜項指令——軟中斷指在SWI異常中斷處理程序中,取出SWI指令中立即數(shù)的步驟為首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可過對 得到然后取得該SWI指令的地址,這可通 LR寄存器得到接著讀出該SWI指令,分解出立即數(shù)SP!,{R0-;現(xiàn)場保R0,;SP!,;保存R0,;測試T標志R0,[LR,#-;若是Thumb指令 指令碼(16位ER0,ER0,R0, 取得Thumb指令的8位立即LDREQR0,[LR,#- ;若是ARM指令 指令碼(32位BICEQR0,R0, 取得ARM指令的24位立即 SP{R0-R3,R12,PC}^SWI異常中斷返ARM雜項指令——狀態(tài)寄存器讀指在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CSR和SPSR進行讀操作。通過讀CPSR可以了解當前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。目標寄存器,不能為區(qū)別CPSR(為目標寄存器,不能為區(qū)別CPSR(為0)指指令對應編ARM雜項指令——狀態(tài)寄存器讀指在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CSR和SPSR進行讀操作。通過讀CPSR可以了解當前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。 MRS指令 應用示例 ;將CPSR狀態(tài)寄存 ,保存到R1 ;將SPSR狀態(tài)寄存 ,保存到R2ARM雜項指令——狀態(tài)寄存器寫指在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/ RQ/FQ中斷等。MSR指令格式 psr_fields,#immedMSR指令格式保存要傳送到狀態(tài)寄存器指定域數(shù)據(jù)要傳送到狀態(tài)寄存x擴展域x擴展域cssfARM雜項指令——狀態(tài)寄存器寫指在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/ RQ/FQ中斷等。MSR指令2要傳送到狀態(tài)寄存ccx擴展域x擴展域 ssf4.返回上一層函數(shù)3.將修改后的值寫回CPSR寄存4.返回上一層函數(shù)3.將修改后的值寫回CPSR寄存的對應控制域2.修改對應于CPSR中的I控制位1.將CPSR寄存器內容讀出到在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/ RQ/FQ中斷等。應用示例;子程序:使能IRQ中應用示例;子程序:禁能IRQ中R0,R0R0,R0,ARM指令 指ARM4.2指令集介ARM偽指ARM偽指令不屬于ARM指令集中的指令,是ARM偽指令——小范圍的地ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該DADR偽指令格 地址表達式expr的取指范圍當?shù)刂分挡皇亲謱R時,其取指范圍為-當?shù)刂分凳亲謱R時,其取指范圍為-當?shù)刂分凳?6字節(jié)對齊時,其取指范圍ARM偽指令ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該D應用示例(源程序使用偽指令將程序標號Delay的地址存入ARM偽指令——小范圍的地ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該D應用示例(源程序 編譯后的反匯編代碼 Delay的地址存入

地 程序代ARM偽指令——小范圍的地ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該D應用示例(源程序 使用偽指令將程序標號Delay的地址存入

編譯后的反匯編代碼0x200x20 0x64 ADR偽指令被匯編成一條指ARM偽指令——小范圍的地ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該D應用示例2(查表;加載轉換表地;使用R2作為參數(shù),進行查… 0xC0,0xF9,0xA4,0xB0,0x99,ARM偽指令——中等范圍的地ADRL偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值到寄存器中,比ADR偽指令可以更大范圍的地址譯器編譯源程序時,DRL偽指令被編譯器替換成兩條合適的指令。若不能ADRL偽指令格地址表達式expr的取指范圍當?shù)刂分挡皇亲謱R時,其取指范圍為-當?shù)刂分凳亲謱R時,其取指范圍為-當?shù)刂分凳?6字節(jié)對齊時,其取指范圍ARM偽指令——中ADRL偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值到寄存器中,比ADR偽指令可以更大范圍的地址譯器編譯源程序時,DRL偽指令被編譯器替換成兩條合適的指令。若不能應用示例(源程序使用偽指令將程序標號Delay的地址存入ARM偽指令——中等范圍的地ADRL偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值到寄存器中,比ADR偽指令可以更大范圍的地址譯器編譯源程序時,DRL偽指令被編譯器替換成兩條合適的指令。若不能應用使用偽指令將程序標號Delay的地址存入

編譯后的反匯編代碼 地 程序代ARM偽指令——中等范圍的地ADRL偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值到寄存器中,比ADR偽指令可以更大范圍的地址譯器編譯源程序時,DRL偽指令被編譯器替換成兩條合適的指令。若不能應用示例(源程序 使用偽指令將程序標號Delay的地址存入

編譯后的反匯編代碼0x20 0x24 0x68 ADRL偽指令被匯編成兩條指令,盡管第2條指令并沒有意ARM偽指令——大范圍的地LDR偽指令用于加載32位的立即數(shù)或一個地址值到指定寄存器。在匯編編譯源程序時,LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條程序相對偏移的LDR指令從文字池讀出常量。LDR偽指令格 基于基于PC的地址表達式R0,ARM偽R0,LDR偽指令用于加載32位的立即數(shù)或一個地址值到指定寄存器。在匯編編譯源程序時,LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條程序相對偏移的LDR指令從文字池讀出常量。應用示例(源程序使用偽指令將程序標號InitStack的地址存入ARM偽指令——大范圍的地LDR偽指令用于加載32位的立即數(shù)或一個地址值到指定寄存器。在匯編編譯源程序時,LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條程序相對偏移的LDR指令從文字池讀出常量。應用示例(源程序 編譯后的反匯編代碼 R0,

R0, 使用偽指令將程序標號InitStack的地址存入

地 程序代R0,ARM偽指令R0,LDR偽指令用于加載32位的立即數(shù)或一個地址值到指定寄存器。在匯編編譯源程序時,LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條程序相對偏移的LDR指令從文字池讀出常量。應用示例(源程序 編譯后的反匯編代碼 R0,使用偽指令將程序標號并在文字池中定義了一個常量,該ARM偽指令——大范圍的地LDR偽指令用于加載32位的立即數(shù)或一個地址值到指定寄存器。在匯編編譯源程序時,LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條程序相對偏移的LDR指令從文字池讀出常量。注意從指令位置到文字池的偏移量必須小于與ARM指令的LDR相比,偽指令的LDR的參數(shù)有“=”號ARM偽指令——空操作偽指NOP偽指令在匯編時將會被代替成ARM中的空操作,比如可能是“MOVR0,R0”指令等。NOP可用于延時操作。NOP偽指令格應用示例(延時子程序第42.4.2指令集介Thumb指子集,它是為減小代碼量而 ,具有16位的代說明:Thumb指令的格式與使用方式與ARM指令集類似,而且使用并不是很頻繁,建議這部分內簡單的Thumb程功能:使用BX

在Thumb程序段之要用 ;R0= ;R1= ;R0=R0+R1 Thumb指令 指Thumb指令 指4.2指令集介Thumb指令集與ARM指令集的區(qū)Thumb指令集較ARM分支指令的跳轉范圍 限制單寄存 Thumb指令 指4.2指令集介 指單寄存 指助記 說 操 影響標

加載 字數(shù)加載 無符號

Rd←[Rn,#immed_5×4],Rd、Rn為 Rd←[Rn,#immed_5×2],Rd、Rn為 Rd←[Rn,#immed_5×1],Rd、Rn為 Rd←[Rn,Rm],Rd、RnRm為 Rd←[Rn,Rm],Rd、RnRm為 4.2指令集介 指LDR和STR——加載 指PC或SP單寄存 指令——立即數(shù)偏移尋以這種尋址方式對器時,器的地址以 ] Rd,[Rn,#immed_5×4];將Rd中的字數(shù)據(jù) Rd,[Rn,#immed_5×2];加載內存中的半字數(shù)據(jù)到寄存器Rd的低16位中 Rd,[Rn,#immed_5×2]; Rd,[Rn,#immed_5×1];加載內存中的字節(jié)數(shù)據(jù)到寄存器Rd中 Rd,[Rn,#immed_5×1] 其中:Rd表示加載 Rn表示基址寄存器。必須為R0~R7immed_5×N表示立即數(shù)偏移量,其取值范圍為(0~31)×NImmed_5:5位無符立即數(shù)偏指令執(zhí)行的條件碼0110b:LDR/STR指Immed_5:5位無符立即數(shù)偏指令執(zhí)行的條件碼0110b:LDR/STR指令1000b:LDRH/STRH指令0111b:LDRB/STRB指令Rn:基址寄存Rd:源或目標寄存L用于區(qū)別加載(L為或(L為單寄存 指令——立即數(shù)偏移尋應用示例 注意:進行字數(shù)據(jù)時,必須保證傳送地址為32位對齊。進行半字數(shù)據(jù)時,必須保證傳送地址為16位對單寄存 指令——寄存器偏移尋一個寄存器的內容為偏移量,兩者相加作為器的地 ;加載一個字 其中:Rd表示加載或 Rn表示基址寄存器。必須為R0~R7。Rm表示內含數(shù)偏移量的寄存器,必須為R0~R7Rm:偏移量寄存指令執(zhí)行的條件碼00b:LDR/STR指令Rm:偏移量寄存指令執(zhí)行的條件碼00b:LDR/STR指令01b:LDRH/STRH指令10b:LDRB/STRB指令Rn:基址寄存Rd:源或目標寄存L用于區(qū)別加載(L為或(L為說說明:當opcode位為11bL位為0代表指令“LDRSB“,L位為1代表單寄存 指令——寄存器偏移尋應用示例LDRSTRLDRHSTRHLDRBSTRBR1,[R3,R2]LDRSHR7,[R6,R3]LDRSB注意:進行字數(shù)據(jù)時,必須保證傳送地址為32位對齊。進行半字數(shù)據(jù)時,必須保證傳送地址為16位對單寄存 指令——相對偏移尋一個立即數(shù)為偏移量,兩者相加作為器的地址。指 其中:Rd表示加載 immed_8×4表示偏移量,取值范圍是(0~255)×4Rd:目標或源寄存單寄存 指令——相Rd:目標或源寄存PC相對偏移LDR指令編(L為為1)L:用于區(qū)別加載(L為為1)L:用于區(qū)別加載(immed8:偏移單寄存 指令——相對偏移尋應用示例 R0,[PC,#0x08]; PC+0x08地址上的字數(shù);保存到R0 LOCALDAT地址上 ;保存到R3 R2寄存器的數(shù)據(jù)到;指向 單元(偏移量為注意:以PC作 址的相對偏移尋址指令只有而沒有STR4.2指令集介 指PUSH和POP——實現(xiàn)低寄存器和可選的LR寄存器入棧及低寄存L用于區(qū)別出棧(L為或入棧(L為指令格reglist入棧/出棧低寄存器列表,即R0~R7 指令編寄存器入棧及出棧指應用示例{R0-;將低寄存器R0~R7全部入棧{R0-;LR也入;將堆棧中的數(shù)據(jù)彈出;低寄存器R0~R7及PC4.2指令集介 指LDMIA和STMIA——多寄存器加載 指可以實現(xiàn)在一組寄存器和一塊連續(xù)的內存單元之間傳輸數(shù)據(jù)。LDMIA為加載多個寄存器;STMIA為多個寄存器。使用它們允許一條指令傳送8多寄存器加載 指指令格 其中:Rn加載 reglist加載 指令編L用于區(qū)別加載(L為還(L為多寄存器加載 指LDMIA/STMIA的主要用于數(shù)據(jù) 、參數(shù)傳送等。進行數(shù)據(jù)傳送時,若Rn在寄存器列表中對于LDMIA指令,Rn的最終值是加載的值,而不是增加后的地對于STMIA指令,若Rn是寄存器列表中的最低數(shù)字的寄存器,則Rn的值為Rn在初值,其它情況不可應用示例R0!,{R2-;加載R0指向的地址上的多字數(shù)R1!,{R2-;保存到R2~R7中,R0的值更新;將R2~R7的數(shù)據(jù)到R1指向;地址上,R1值更Thumb指令 指4.2指令集介Thumb數(shù)據(jù)處理指數(shù)操作。大部分的Thumb數(shù)據(jù)處理指令采用2地址更少,并且寄存器R8~R15受到限制。數(shù)據(jù)處4.2指令集介Thumb數(shù)據(jù)處理指令——數(shù)據(jù)傳送指Rd←expr,Rd為影響N、Rd←(~RmRd、Rm均為影響N、Rd←(-RmRd、Rm均為影響N、Z、C、數(shù)據(jù)傳送指令——MOV指令將8位立即數(shù)或寄存器傳送到目標寄存器中。其指令格式如下 其中:Rd目標寄存器。MOVRd,#expr時,Rd必須在R0~R7之間。exper8位立即數(shù),即0~255。Rm源寄存器。為R0~R15指令編碼(立即數(shù)傳送指令編碼(寄存器傳送數(shù)據(jù)傳送指令——注意“MOVRd,#expr”指令會更新N和Z標志,對標志C和V無影響“MOVRd,Rm”指令,若Rd或Rm是高寄存器(R8~R15),則標志不受影響,若R或m都是低寄存器(0~7),則更新標志N和Z,且清CV。應用示例;;;PC=LR,子程序返數(shù)據(jù)傳送指令——MVN指令將寄存器Rm按位取反后傳送到目標寄存器Rd中。指令的執(zhí)行會更新NZ標志,對標志CV無影響。其指令格式如下:其中:Rd目標寄存器。MOVRd,#expr時,Rd必須在R0~R7Rm源寄存器。為R0~R15指令編數(shù)據(jù)傳送指令——MVN指令將寄存器Rm按位取反后傳送到目標寄存器Rd中。指令的執(zhí)行會更新NZ標志,對標志CV無影響。其指令格式如下:其中:Rd目標寄存器。MOVRd,#expr時,Rd必須在R0~R7Rm源寄存器。為R0~R15應用示例 ;將R2取反,結果存于數(shù)據(jù)傳送指令——NEG指令將寄存器Rm乘以-1后傳送到目標寄存器Rd中指令會更新N、Z、C和V標志。其指令格式如下其中:Rd目標寄存器,必須在R0~R7Rm源寄存器。為R0~R15指令編數(shù)據(jù)傳送指令——NEG指令將寄存器Rm乘以-1后傳送到目標寄存器Rd中指令會更新N、Z、C和V標志。其指令格式如下其中:Rd目標寄存器,必須在R0~R7Rm源寄存器。為R0~R15應用示例 ;R1=-4.2指令集介Thumb數(shù)據(jù)處理指令——算術邏輯運算指算術運算指令——ADD指令將兩個數(shù)據(jù)相加,結果保存到Rd其中:Rd目標寄存器,必須在R0~R7Rn其中:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論