版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、ARM 微處理器的指令集,1.ARM處理器尋址方式 2.ARM指令集 Resources : http:/www.peter- http:/www.heyrick.co.uk/assembler/,ARM 微處理器的指令集,ARM微處理器的工作狀態(tài)有兩種: ARM狀態(tài),此時處理器執(zhí)行32位的、字對齊的ARM指令; Thumb狀態(tài),此時處理器執(zhí)行16位的、半字對齊的Thumb指令。 在程序的執(zhí)行過程中,微處理器可以隨時在兩種工作狀態(tài)之間切換,并且,處理器工作狀態(tài)的轉變并不影響處理器的工作模式和相應寄存器中的內容。,ARM 微處理器的指令集,ARM指令集支持ARM核所有的特性,具有高效、快速的特點
2、。 Thumb指令集具有靈活、小巧的特點。,ARM狀態(tài)下的寄存器組織(2),37個32位寄存器,其中31個為通用寄存器,6個為狀態(tài)寄存器。,用戶模式、系統(tǒng)模式,快速中斷模式,管理模式,數據訪問終止模式,外部中斷模式,未定義指令中止模式,未分組寄存器R0R7,在所有的運行模式下,未分組寄存器都指向同一個物理寄存器,他們未被系統(tǒng)用作特殊用途。 在中斷或異常處理進行運行模式轉換時,由于不同的處理器運行模式均使用相同的物理寄存器,可能會造成寄存器中數據的破壞,這一點在進行程序設計時應引起注意。,分組寄存器R8R12,R8R12:每個寄存器對應兩個不同的物理寄存器 當使用fiq模式時,訪問寄存器R8_f
3、iqR12_fiq; 當使用除fiq模式以外的其他模式時,訪問寄存器R8_usrR12_usr。,分組寄存器R13R14,R13、R14:每個寄存器對應6個不同的物理寄存器,其中的一個是用戶模式與系統(tǒng)模式共用,另外5個物理寄存器對應于其他5種不同的運行模式,堆棧指針R13,R13在ARM指令中常用作堆棧指針,但這只是一種習慣用法,用戶也可使用其他的寄存器作為堆棧指針。 在Thumb指令集中,某些指令強制性的要求使用R13作為堆棧指針。 由于處理器的每種運行模式均有自己獨立的物理寄存器R13,在初始化部分,都要初始化每種模式下的R13,這樣,當程序的運行進入異常模式時,可以將需要保護的寄存器放入
4、R13所指向的堆棧,而當程序從異常模式返回時,則從對應的堆棧中恢復,子程序連接寄存器R14,子程序連接寄存器或連接寄存器LR。 當執(zhí)行BL子程序調用指令時,可以從R14中得到R15(程序計數器PC)的備份。在每一種運行模式下,都可用R14保存子程序的返回地址,當用BL或BLX指令調用子程序時,將PC的當前值拷貝給R14,執(zhí)行完子程序后,又將R14的值拷貝回PC,即可完成子程序的調用返回。 BLSUB1 SUB1:STMFDSP!, , LR /*將R14存入堆棧*/ LDMFDSP!,PC/*完成子程序返回 */,程序計數器PC(R15),ARM狀態(tài)下,位1:0為0,位31:2用于保存PC;,
5、Thumb狀態(tài)下,位0為0,位31:1用于保存PC;,R15雖然也可用作通用寄存器,但一般不這么使用,因為對R15的使用有一些特殊的限制,當違反了這些限制時,程序的執(zhí)行結果是未知的。,由于ARM體系結構采用了多級流水線技術,對于ARM指令集而言,PC總是指向當前指令的下兩條指令的地址,即PC的值為當前指令的地址值加8個字節(jié)。,程序狀態(tài)寄存器(CPSR/SPSR),寄存器R16用作CPSR(當前程序狀態(tài)寄存器),CPSR可在任何運行模式下被訪問,它包括條件標志位、中斷禁止位、當前處理器模式標志位,以及其他一些相關的控制和狀態(tài)位。,每一種運行模式下又都有一個專用的物理狀態(tài)寄存器,稱為SPSR(備份
6、的程序狀態(tài)寄存器),異常發(fā)生時,SPSR用于保存CPSR的值,從異常退出時則可由SPSR來恢復CPSR。,由于用戶模式和系統(tǒng)模式不屬于異常模式,他們沒有SPSR,當在這兩種模式下訪問SPSR,結果是未知的。,1 ARM處理器尋址方式,尋址方式分類,尋址方式是根據指令中給出的地址碼字段來實現(xiàn)尋找真實操作數地址的方式。ARM處理器具有9種基本尋址方式。 1.寄存器尋址; 2.立即尋址; 3.寄存器移位尋址;4.寄存器間接尋址; 5.基址尋址;6.多寄存器尋址; 7.堆棧尋址;8.塊拷貝尋址; 9.相對尋址。,操作數的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執(zhí)行時直接取出寄存器值來操
7、作。寄存器尋址指令舉例如下: MOV R1,R2 ;將R2的值存入R1 SUB R0,R1,R2 ;將R1的值減去R2的值,結果保存到R0,1 ARM處理器尋址方式,尋址方式分類寄存器尋址,MOV R1,R2,0 xAA,立即尋址指令中的操作碼字段后面的地址碼部分即是操作數本身,也就是說,數據就包含在指令當中,取出指令也就取出了可以立即使用的操作數(這樣的數稱為立即數)。立即尋址指令舉例如下: SUBSR0,R0,#1 ;R0減1,結果放入R0,并且影響標志位 MOVR0,#0 xFF000 ;將立即數0 xFF000裝入R0寄存器,1 ARM處理器尋址方式,尋址方式分類立即尋址,MOV R0
8、,#0 xFF00,0 xFF00,從代碼中獲得數據,寄存器移位尋址是ARM指令集特有的尋址方式。當第2個操作數是寄存器移位方式時,第2個寄存器操作數在與第1個操作數結合之前,選擇進行移位操作。寄存器移位尋址指令舉例如下: MOVR0,R2,LSL #3;R2的值左移3位,結果放入R0, ;即是R0=R28 ANDSR1,R1,R2,LSL R3;R2的值左移R3位,然后 ;和R1相“與”操作,結果放入R1,1 ARM處理器尋址方式,尋址方式分類寄存器移位尋址,MOV R0,R2,LSL #3,0 x08,0 x08,邏輯左移3位,寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需
9、的操作數保存在寄存器指定地址的存儲單元中,即寄存器為操作數的地址指針。例如: LDRR1,R2;將R2指向的存儲單元的數據 ;讀出保存在R1中 SWPR1,R1,R2;將寄存器R1的值和R2 ;指定的存儲單元的內容交換,1 ARM處理器尋址方式,尋址方式分類寄存器間接尋址,LDR R0,R2,0 xAA,基址尋址就是將基址寄存器的內容與指令中給出的偏移量(4K)相加/減,形成操作數的有效地址?;穼ぶ酚糜谠L問基址附近的存儲單元,常用于查表、數組操作、功能部件寄存器訪問等。寄存器間接尋址是偏移量為0的基址加偏移尋址。 基址尋址指令舉例如下(前索引尋址): LDRR2,R3,#0 x0C ;讀取R
10、3+0 x0C地址上的 ;存儲單元的內容,放入R2 STRR1,R0,#-4!;先R0=R0-4,然后把R1的值 ;寄存到保存到R0指定的存儲單元,1 ARM處理器尋址方式,尋址方式分類基址尋址,LDR R2,R3,#0 x0C,0 xAA,將R3+0 x0C作為地址裝載數據,基址尋址指令舉例如下: LDRR0,R1,#4;R0=R1,R1R14 ;后索引基址尋址 LDR R0,R1,R2 ;R0=R1+R2,1 ARM處理器尋址方式,尋址方式分類基址尋址,多寄存器尋址一次可傳送幾個寄存器值,允許一條指令傳送16個寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下: LDMIAR1!,R2
11、-R7,R12 ;將R1指向的單元中的數據讀出到R2R7、R12中(R1自動加4) STMIAR0!,R2-R7,R12 ;將寄存器R2R7、R12的值保存到R0指向的存儲; 單元中(R0自動加4),1 ARM處理器尋址方式,尋址方式分類多寄存器尋址,LDMIA R1!,R2-R4,R6,0 x40000010,堆棧是一個按特定順序進行存取的存儲區(qū),操作順序為“后進先出” 。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區(qū)域(堆棧),指針所指向的存儲單元即是堆棧的棧頂。存儲器堆??煞譃閮煞N: 向上生長:向高地址方向生長,稱為遞增堆棧 向下生長:向低地址方向生長,稱為遞減堆棧,
12、1 ARM處理器尋址方式,尋址方式分類堆棧尋址,1 ARM處理器尋址方式,尋址方式分類堆棧尋址,0 x12345678,0 x12345678,堆棧指針指向最后壓入的堆棧的有效數據項,稱為滿堆棧;堆棧指針指向下一個待壓入數據的空位置,稱為空堆棧。,1 ARM處理器尋址方式,尋址方式分類堆棧尋址,0 x12345678,所以可以組合出四種類型的堆棧方式: 滿遞增:堆棧向上增長,堆棧指針指向內含有效數據項的最高地址。指令如LDMFA、STMFA等; 空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如LDMEA、STMEA等; 滿遞減:堆棧向下增長,堆棧指針指向內含有效數據項的最低地址。
13、指令如LDMFD、STMFD等; 空遞減:堆棧向下增長,堆棧指針向堆棧下的第一個空位置。指令如LDMED、STMED等。,1 ARM處理器尋址方式,尋址方式分類堆棧尋址,多寄存器傳送指令用于將一塊數據從存儲器的某一位置拷貝到另一位置。 如: STMIAR0!,R1-R7;將R1R7的數據保存到存儲器中。存儲指針R0在保存第一個值之后增加,增長方向為向上增長。,1 ARM處理器尋址方式,尋址方式分類塊拷貝尋址,相對尋址是基址尋址的一種變通。由程序計數器PC提供基準地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數的有效地址。相對尋址指令舉例如下: BL SUBR1;調用到SUBR
14、1子程序 BEQLOOP;條件跳轉到LOOP標號處 . LOOP MOVR6,#1 . SUBR1.,1 ARM處理器尋址方式,尋址方式分類相對尋址,1 ARM指令集 簡單的ARM程序,;文件名:TEST1.S ;功能:實現(xiàn)兩個寄存器相加 ;說明:使用ARMulate軟件仿真調試 AREAExample1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標識程序入口 CODE32 ;聲明32位ARM指令 START MOVR0,#0 ;設置參數 MOVR1,#10 LOOPBLADD_SUB ;調用子程序ADD_SUB BLOOP ;跳轉到LOOP ADD_SUB AD
15、DSR0,R0,R1 ;R0 = R0 + R1 MOVPC,LR ;子程序返回 END ;文件結束,使用“;”進行注釋,標號頂格寫,實際代碼段,聲明文件結束,簡單的ARM程序,;文件名:TEST1.S ;功能:實現(xiàn)兩個寄存器相加 ;說明:使用ARMulate軟件仿真調試 AREAExample1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標識程序入口 CODE32 ;聲明32位ARM指令 START MOVR0,#0 ;設置參數 MOVR1,#10 LOOPBLADD_SUB ;調用子程序ADD_SUB BLOOP ;跳轉到LOOP ADD_SUB ADDSR0
16、,R0,R1 ;R0 = R0 + R1 MOVPC,LR ;子程序返回 END ;文件結束,ARM指令小節(jié)目錄,1.指令格式 2.條件碼 3.存儲器訪問指令 4.數據處理指令 5.乘法指令 6.ARM分支指令 7.雜項指令 8.偽指令,ARM是三地址指令格式,指令的基本格式如下:,1 ARM指令集介紹,ARM指令集基本指令格式, S ,其中號內的項是必須的,號內的項是可選的。各項的說明如下:,opcode:指令助記符;cond:執(zhí)行條件; S:是否影響CPSR寄存器的值; Rd:目標寄存器; Rn:第1個操作數的寄存器; operand2:第2個操作數;,例:,ARM指令的基本格式如下:,1
17、 ARM指令集介紹,ARM指令集第2個操作數, S ,靈活的使用第2個操作數“operand2”能夠提高代碼效率。它有如下的形式: #immed_8r常數表達式; Rm寄存器方式; Rm,shift寄存器移位方式;,1 ARM指令集介紹,ARM指令集第2個操作數,#immed_8r常數表達式,例如: ANDR1,R2,#0 x0F 說明: ADD條件S , , dest = op_1 + op_2 ADD 將把兩個操作數加起來,把結果放置到目的寄存器中。 操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器,或一個立即值:,1 ARM指令集介紹,ARM指令集第2個操作數,Rm
18、寄存器方式 在寄存器方式下,操作數即為寄存器的數值。 例如: SUBR1,R1,R2 說明:SUB條件S , , dest = op_1 - op_2,1 ARM指令集介紹,ARM指令集第2個操作數,Rm,shift寄存器移位方式 將寄存器的移位結果作為操作數(移位操作不消耗額外的時間),但Rm值保持不變,移位方法如下: ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 1),1 ARM指令集介紹,ARM指令集第2個操作數,Arithmetic Shift Right,Logic Shift Right,Logic Shift Left,Rotate Right,1 A
19、RM指令集介紹,ARM指令集第2個操作數,Rm,shift寄存器移位方式 例如: ADDR1,R1,R1,LSL #3 ;R1=R1+R1R3,ARM指令的基本格式如下:,1 ARM指令集介紹,ARM指令集條件碼, S ,使用條件碼“cond”可以實現(xiàn)高效的邏輯操作(節(jié)省跳轉和條件語句),提高代碼效率。 所有的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉)指令具有條件執(zhí)行功能。如果指令不標明條件代碼,將默認為無條件(AL)執(zhí)行。,指令條件碼表,1 ARM指令集介紹,ARM指令集條件碼,C代碼: If(a b) a+; Else b+;,對應的匯編代碼: CMPR0,R1 ;R0(a)
20、與R1(b)比較 ADDHI R0,R0,#1 ;若R0R1,則R0=R0+1 ADDLS R1,R1,#1 ;若R01,則R1=R1+1,示例:,CMP R1, R2 ;SET C ON R1-R2 CMN R1, R2 ; SET C ON R1+R2 TST R1, R2 ; SET C ON R1 AND R2 TEQ R1, R2 ; SET C ON R1 XOR R2,1 ARM指令集介紹,ARM指令集存儲器訪問指令,ARM處理器是典型的RISC處理器,對存儲器的訪問只能使用加載和存儲指令實現(xiàn)。RAM存儲空間及I/O映射空間統(tǒng)一編址,除對RAM操作以外,對外圍IO、程序數據的訪問
21、均要通過加載/存儲指令進行。 存儲器訪問指令分為單寄存器操作指令和多寄存器操作指令。,ARM存儲器訪問指令單寄存器加載,ARM存儲器訪問指令單寄存器存儲,LDR/STR指令用于對內存變量的訪問、內存緩沖區(qū)數據的訪問、查表、外圍部件的控制操作等。若使用LDR指令加載數據到PC寄存器,則實現(xiàn)程序跳轉功能,這樣也就實現(xiàn)了程序散轉。 所有單寄存器加載/存儲指令可分為“字和無符號字節(jié)加載存儲指令”和“半字和有符號字節(jié)加載存儲指令。,LDR和STR字和無符號字節(jié)加載/存儲指令 LDR指令用于從內存中讀取單一字或字節(jié)數據存入寄存器中,STR指令用于將寄存器中的單一字或字節(jié)數據保存到內存。指令格式如下:,AR
22、M存儲器訪問指令單寄存器存儲,LDRcondTRd, ;將指定地址上的字數據讀入Rd STRcondTRd, ;將Rd中的字數據存入指定地址 LDRcondBTRd, ;將指定地址上的字節(jié)數據讀入Rd STRcondBTRd, ;將Rd中的字節(jié)數據存入指定地址,其中,T為可選后綴。若指令有T,那么即使處理器是在特權模式下,存儲系統(tǒng)也將訪問看成是在用戶模式下進行的。T在用戶模式下無效,不能與前索引偏移一起使用T。,ARM存儲器訪問指令單寄存器存儲,LDR和STR字和無符號字節(jié)加載/存儲指令編碼,指令執(zhí)行的條件碼,I為0時,偏移量為12位立即數,為1時,偏移量為寄存器移位,P表示前/后變址,U表示
23、加/減,B為1表示字節(jié)訪問,為0表示字訪問,W表示回寫,為指令的尋址方式,Rd為源/目標寄存器,Rn為基址寄存器,L用于區(qū)別加載(L為1)或存儲(L為0),ARM存儲器訪問指令單寄存器存儲,LDR和STR字和無符號字節(jié)加載/存儲指令 LDR/STR指令尋址非常靈活,它由兩部分組成,其中一部分為一個基址寄存器,可以為任一個通用寄存器;另一部分為一個地址偏移量。地址偏移量有以下3種格式: 立即數。立即數可以是一個無符號的數值。這個數據可以加到基址寄存器,也可以從基址寄存器中減去這個數值。 如:LDR R1,R0,#0 x12 ;R1-R0+0 x12 寄存器。寄存器中的數值可以加到基址寄存器,也可
24、以從基址寄存器中減去這個數值。 如:LDR R1,R0,R2 ; R1-R0+R2 LDR R1,R0,-R2 ; R1-R0-R2 寄存器及移位常數。寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個數值。 如:LDR R1,R0,R2,LSL #2 ;R1-R0+R2*4,LDR和STR半字和有符號字節(jié)加載/存儲指令 這類LDR/STR指令可加載有符號半字或字節(jié),可加載/存儲無符號半字。偏移量格式、尋址方式與加載/存儲字和無符號字節(jié)指令相同。,ARM存儲器訪問指令單寄存器存儲,LDRcondSB Rd,;將指定地址上的有符號字節(jié)讀入Rd LDRcondSH Rd,;將指定地址
25、上的有符號半字讀入Rd LDRcondH Rd,;將指定地址上的半字數據讀入Rd STRcondH Rd,;將Rd中的半字數據存入指定地址,注意: 1.有符號位半字/字節(jié)加載是指用符號位加載擴展到32位,無符號半字加載是指用零擴展到32位; 2.半字讀寫的指定地址必須為偶數,否則將產生不可靠的結果;,ARM存儲器訪問指令單寄存器存儲,LDR和STR半字和有符號字節(jié)加載/存儲指令編碼,指令執(zhí)行的條件碼,I為0時,偏移量為12位立即數,為1時,偏移量為寄存器移位,P表示前/后變址,U表示加/減,W表示回寫,為指令的尋址方式,Rd為源/目標寄存器,Rn為基址寄存器,L用于區(qū)別加載(L為1)或存儲(L
26、為0),S為1表示有符號訪問,為0表示無符號訪問,H為1表示半字訪問,為0表示字節(jié)訪問,LDR和STR指令應用示例: 1.加載/存儲字和無符號字節(jié)指令 LDRR2,R5;將R5指向地址的字數據存入R2 STRR1,R0,#0 x04;將R1的數據存儲到R0+0 x04地址 LDRBR3,R2,#-1 ;將R2指向地址的字節(jié)數據存入R3,R2R21 STRBR0,R3,-R8 ASR 2 ;R0-R3-R8/4,存儲R0的最低有效字節(jié) 2.加載/存儲半字和有符號字節(jié)指令 LDRSB R1,R0,R3;將R0+R3地址上的字節(jié)數據存入R1, ;高24位用符號擴展 LDRH R6,R2,#2;將R2
27、指向地址的半字數據存入R6,高16位用0擴展 ;讀出后,R2=R2+2 STRH R1,R0,#2!;將R1的半字數據保存到R0+2地址, ;只修改低2字節(jié)數據,然后R0=R0+2,ARM存儲器訪問指令單寄存器存儲,(3)LDR和STR -雙字:加載/存儲兩個相鄰的寄存器,64位雙字。其句法有4種: Op cond D Rd,Rn 零偏移 Op cond D Rd,Rn,offset ! 前索引偏移 Op cond D Rd,label 程序相對偏移 Op cond D T Rd,Rn,offset 后索引偏移,ARM存儲器訪問指令單寄存器存儲,其中: Rd加載/存儲寄存器中的一個,另一個是R
28、(d+1)。Rd必須是偶數寄存器,且不是R14。 Rn除非指令為零偏移,或不帶寫回的前索引,否則,Rn不允許與Rd和R(d+1)相同。 labellabel必須是在當前指令的上下252字節(jié)范圍內。 例如: LDRD R6,R11 ;R6R11,R7R11+4 STRD R4,R9,#24 ;R4R9+24,R5R9+28,ARM存儲器訪問指令單寄存器存儲,ARM存儲器訪問指令多寄存器存取,多寄存器加載/存儲指令可以實現(xiàn)在一組寄存器和一塊連續(xù)的內存單元之間傳輸數據。LDM為加載多個寄存器;STM為存儲多個寄存器。允許一條指令傳送16個寄存器的任何子集或所有寄存器。它們主要用于現(xiàn)場保護、數據復制、
29、常數傳遞等。,ARM存儲器訪問指令多寄存器存取,多寄存器加載/存儲指令格式如下: LDMcond Rn!,reglist STMcond Rn!,reglist cond:指令執(zhí)行的條件; 模式:控制地址的增長方式,一共有8種模式; !:表示在操作結束后,將最后的地址寫回Rn中; reglist :表示寄存器列表,可以包含多個寄存器,它們使用“,”隔開,如R1,R2,R6-R9,寄存器由小到大排列; :可選后綴。允許在用戶模式或系統(tǒng)模式下使用。它有以下兩個功能: 1)若op是LDM且寄存器列表包含R15時,那么除了正常的多寄存器傳送外,還將SPSR也復制到CPSR中。這用于異常處理返回,僅在異
30、常模式下使用。 2)如寄存器列表包含R15時,數據傳入或傳出的是用戶模式下的寄存器,而不是當前模式的寄存器。,ARM存儲器訪問指令多寄存器存取,LDM和STM多寄存器加載/存儲指令編碼,指令執(zhí)行的條件碼,S對應于指令中的”符號,P表示前/后變址,U表示加/減,W表示回寫,寄存器列表,Rn為基址寄存器,L用于區(qū)別加載(L為1)或存儲(L為0),ARM存儲器訪問指令多寄存器存取,多寄存器加載/存儲指令的8種模式如下表所示,右邊四種為堆棧操作、左邊四種為數據傳送操作。,進行數據復制時,先設置好源數據指針和目標指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/ST
31、MDA、LDMDB/STMDB進行讀取和存儲 。 進行堆棧操作操作時,要先設置堆棧指針(SP),然后使用堆棧尋址指令STMFD/LDMFD 、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實現(xiàn)堆棧操作。,ARM存儲器訪問指令多寄存器存取,數據塊傳送指令操作過程如右圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1則為指令執(zhí)行后的基址寄存器。,ARM存儲器訪問指令多寄存器存取,;使用數據塊傳送指令進行堆棧操作 STMDAR0!,R5-R6 . . . LDMIBR0!,R5-R6,;使用堆棧指令進行堆棧操作 STMEDR13!,R5-R6 . . . LDMEDR13!,R5
32、-R6,兩段代碼的執(zhí)行結果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡單(只要前后一致即可),而使用數據塊指令進行壓棧和出棧操作則需要考慮空與滿、加與減對應的問題。,ARM存儲器訪問指令寄存器和存儲器交換指令,SWP指令用于將一個內存單元(該單元地址放在寄存器Rn中)的內容讀取到一個寄存器Rd中,同時將另一個寄存器Rm的內容寫入到該內存單元中。使用SWP可實現(xiàn)信號量操作。 指令格式如下: SWPcondB Rd,Rm,Rn 其中,B為可選后綴,若有B,則交換字節(jié),否則交換32位字;Rd用于保存從存儲器中讀入的數據;Rm的數據用于存儲到存儲器中,若Rm與Rd相同,則為寄存器與存儲器內容進行
33、互換;Rn為要進行數據交換的存儲器地址,Rn不能與Rd和Rm相同。,ARM存儲器訪問指令寄存器和存儲器交換指令,SWP和SWPB寄存器和存儲器交換指令編碼,指令執(zhí)行的條件碼,B用于區(qū)別無符號字節(jié)(B為1)或字(B為0),Rm源寄存器,Rd目標寄存器,Rn為基址寄存器,SWP指令應用示例: SWPR1,R1,R0;將R1的內容與R0指向的存儲單元的內容互換 SWPBR1,R2,R0;將R0指向的存儲單元低字節(jié)數據讀取到R1中 ;(高24位清零),并將R2的內容寫到該內存單元中(最低字節(jié)有效),1 ARM指令集介紹,ARM指令集ARM數據處理指令,數據處理指令大致可分為3類: 數據傳送指令; 算術
34、邏輯運算指令; 比較指令。 數據處理指令只能對寄存器的內容進行操作,而不能對內存中的數據進行操作。所有ARM數據處理指令均可選擇使用S后綴,以使指令影響狀態(tài)標志。,ARM數據處理指令指令編碼,指令執(zhí)行的條件碼,I用于區(qū)別立即數(I為1)和寄存器移位(I為0),opcode數據處理指令操作碼,第二操作數,Rd目標寄存器,Rn第一操作數寄存器,S設置條件碼,與指令中的S位對應,ARM數據處理指令數據傳送,注:當后綴S時,這些指令根據結果更新標志N和Z,在計算Operand2時更新標志C,不影響標志V。,ARM數據處理指令數據傳送,MOV指令將8位圖立即數(參看“第2操作數:#immed_8r常數表
35、達式 ”)或寄存器傳送到目標寄存器(Rd),可用于移位運算等操作。指令格式如下: MOVcondS Rd,operand2 MOV指令舉例如下: MOVR11,#0 xF000000B;R1= 0 xF000000B MOVR0,R1;R0=R1 MOVSR3,R1,LSL #2;R3=R12,并影響標志位 MOVPC,LR;PC=LR,子程序返回,ARM數據處理指令數據傳送,MVN指令將8位立即數或寄存器(operand2)按位取反后傳送到目標寄存器(Rd),因為其具有取反功能,所以可以裝載范圍更廣的立即數。指令格式如下: MVNcondS Rd,operand2 MVN指令舉例如下: MV
36、NR1,#0 xFF;R1=0 xFFFFFF00 MVNR1,R2 ;將R2按位取反,結果存到R1,ARM數據處理指令算術運算,注:這些指令影響N,Z,C和V標志位。,ARM數據處理指令算術運算,加法運算指令ADD指令將operand2的值與Rn的值相加,結果保存到Rd寄存器。指令格式如下: ADDcondS Rd,Rn,operand2 應用示例: ADDS R1,R1,#1020; R1=R1+1020,并影響標志位 ADD R1,R1,R2,LSL #2;R1=R1+R22,ARM數據處理指令算術運算,減法運算指令SUB指令用寄存器Rn減去operand2,結果保存到Rd中。指令格式如
37、下: SUBcondS Rd,Rn,operand2 應用示例: SUBSR0,R0,#240;R0=R0-240 ,并影響標志位 SUBSR2,R1,R2;R2=R1-R2 ,并影響標志位,ARM數據處理指令算術運算,逆向減法運算指令RSB指令將operand2的值減去Rn,結果保存到Rd中。指令格式如下: RSBcondS Rd,Rn,operand2 應用示例: RSB R3,R1,#0 xFF00 ;R3=0 xFF00-R1 RSBS R1,R2,R2,LSL #2 ;R1=(R22)-R2影響標志位,ARM數據處理指令算術運算,帶進位加法指令ADC將operand2的值與Rn的值相
38、加,再加上CPSR中的C條件標志位,結果保存到Rd寄存器。指令格式如下: ADCcondS Rd,Rn,operand2 例:(用ADC實現(xiàn)64位加法,結果存于R1(高32位)、R0中): ADDS R0,R0,R2 ;R0等于低32位相加,并影響標志位 ADC R1,R1,R3;R1等于高32位相加,并加上低位進位,ARM數據處理指令算術運算,帶進位減法指令SBC用寄存器Rn減去operand2,再減去CPSR中的C條件標志位的非,結果保存到Rd中。指令格式如下: SBCcondS Rd,Rn,operand2 例(使用SBC實現(xiàn)64位減法,結果存于R1、R0中): SUBS R0,R0,R
39、2 ; 低32位相減,并影響標志位 SBC R1,R1,R3;高32位相減,并減去低位借位,ARM數據處理指令算術運算,帶進位逆向減法指令RSC指令用寄存器operand2減去Rn,再減去CPSR中的C條件標志位,結果保存到Rd中。指令格式如下: RSCcondS Rd,Rn,operand2 應用示例(使用RSC指令實現(xiàn)求64位數值的負數 ): RSBS R2,R0,#0 ;R2=-R0 RSC R3,R1,#0 ;R3=-R1- !Carry,ARM數據處理指令邏輯運算指令,注:當后綴S時,這些指令根據結果更新標志N和Z,在計算Operand2時更新標志C,不影響標志V。,ARM數據處理指
40、令邏輯運算指令,邏輯與操作指令AND指令將operand2的值與寄存器Rn的值按位作邏輯“與”操作,結果保存到Rd中。指令格式如下: ANDcondS Rd,Rn,operand2 AND 將在兩個操作數上進行邏輯與,把結果放置到目的寄存器中;對屏蔽你要在上面工作的位很有用。 操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器,或一個立即值: 例:ANDS R0,R0,#0 x01;R0=R0將R1的低4位取反 EOR R2,R1,R0 ;R2=R1R0 EORSR0,R5,#0 x01; 將R5和0 x01進行邏輯異或, ;結果保存到R0,并影響標志位,ARM數據處理指令
41、邏輯運算指令,位清除指令BIC指令將寄存器Rn的值與operand2的值的反碼按位作邏輯“與”操作,結果保存到Rd中。指令格式如下: BICcondS Rd,Rn, operand2 例:BIC R1,R1,#0 x0F ;將R1的低4位清零,其它位不變 BIC R1,R2,R3 ;將R3的反碼和R2相邏輯“與”, ;結果保存到R1中,ARM數據處理指令比較指令,注:這些指令影響N,Z,C和V標志位。,ARM數據處理指令比較指令,比較指令CMP指令將寄存器Rn的值減去operand2的值,根據操作的結果更新CPSR中的相應條件標志位(N/Z/C/V) 。指令格式如下: CMPcondRn, o
42、perand2 例:CMPR1,#10 ; R1與10比較,設置相關標志位 CMPGTR1,R2; R1與R2比較,設置相關標志位 ;若R110, 則執(zhí)行本指令,ARM數據處理指令比較指令,負數比較指令CMN指令使用寄存器Rn的值加上operand2的值,根據操作的結果更新CPSR中的相應條件標志位。指令格式如下: CMNcondRn, operand2 例:CMNR0,#1 ; R0+1,判斷R0是否為1的補碼 ;如果是,則設置Z標志位,ARM數據處理指令比較指令,負數比較指令CMN指令使用寄存器Rn的值加上operand2的值,根據操作的結果更新CPSR中的相應條件標志位。指令格式: CM
43、NcondRn, operand2,注意:CMN指令與ADDS指令的區(qū)別在于CMN指令不保存運算結果。CMN指令可用于負數比較,比如CMN R0,#1指令則表示R0與-1比較,若R0為-1(即1的補碼),則Z置位;否則Z復位。,ARM數據處理指令比較指令,位測試指令TST指令將寄存器Rn的值與operand2的值按位作邏輯“與”操作,根據操作的結果更新CPSR中的相應條件標志位。指令格式如下:TSTcond Rn, operand2 例:TSTR0,#0 x01; 判斷R0的最低位是否為0 TSTR1,#0 x0F; 判斷R1的低4位是否為0,ARM數據處理指令比較指令,位測試指令TST指令將
44、寄存器Rn的值與operand2的值按位作邏輯“與”操作,根據操作的結果更新CPSR中的相應條件標志位。指令格式如下: TSTcond Rn, operand2,注意:TST指令與ANDS指令的區(qū)別在于TST指令不保存運算結果。TST指令通常與EQ、NE條件碼配合使用,當所有測試位均為0時,EQ有效(Z=1),而只要有一個測試位不為0,則NE有效(Z=0) 。,ARM數據處理指令比較指令,相等測試指令TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,影響CPSR中的相應條件標志位。指令格式如下: TEQcond Rn, operand2 例:TEQR0,R1; 比較R0與
45、R1是否相等 (不影響V位和C位),ARM數據處理指令比較指令,相等測試指令TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,根據操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據相應的條件標志來判斷是否執(zhí)行。指令格式如下: TEQcond Rn, operand2,1 ARM指令集介紹,ARM指令集乘法指令,ARM具有三種乘法指令,分別為: 3232位乘法指令; 32 32位乘加指令; 32 32位結果為64位的乘/乘加指令。,ARM指令乘法指令,乘法指令編碼,指令執(zhí)行的條件碼,Opcode乘法指令操作碼,S設置條件碼,與指令中的S位對應,Rm為被乘數寄存器,
46、Rn/RdLo為MLA指令相加的寄存器或64位乘法指令的目標寄存器(低32位),Rd/RdHi為目標寄存器或64位乘法指令的目標寄存器(高32位),Rs為乘數寄存器,ARM指令乘法指令,ARM指令乘法指令,32位乘法指令MUL指令將Rm和Rs中的值相乘,結果的低32位保存到Rd中。 Rd,Rm,Rs不能為R15。只影響CPSR中的N位和Z位,不影響V,C不確定。指令格式如下: MULcondS Rd,Rm,Rs 例:MUL R1,R2,R3 ;R1=R2R3 MULS R0,R3,R7 ;R0=R3R7,影響CPSR中的N位和Z位,ARM指令乘法指令,32位乘加指令MLA指令將Rm和Rs中的值
47、相乘,再將乘積加上第3個操作數,結果的低32位保存到Rd中。 Rd,Rm,Rs,Rn不能為R15。只影響CPSR中的N位和Z位,不影響V,C不確定。指令格式如下: MLAcondS Rd,Rm,Rs,Rn 例:MLA R1,R2,R3,R0; R1=R2R3+R0,ARM指令乘法指令,64位無符號乘法指令UMULL指令將Rm和Rs中的值作無符號數相乘,結果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能為R15。 RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標志C和V不確定。指令格式如下: UMULLcondS RdLo,RdH
48、i,Rm,Rs 應用示例: UMULL R0,R1,R5,R8; (R1、R0)=R5R8,ARM指令乘法指令,64位無符號乘加指令UMLAL指令將Rm和Rs中的值作無符號數相乘,64位乘積與RdHi、RdLo相加,結果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能為R15。 RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標志C和V不確定。指令格式如下: UMLALcondS RdLo,RdHi,Rm,Rs 應用示例: UMLAL R0,R1,R5,R8;(R1、R0)=R5R8+(R1、R0),ARM指令乘法指令,64位有符號
49、乘法指令SMULL指令將Rm和Rs中的值作有符號數相乘,結果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能為R15。 RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標志C和V不確定。指令格式如下: SMULLcondS RdLo,RdHi,Rm,Rs 應用示例: SMULLR2,R3,R7,R6; (R3、R2)=R7R6,ARM指令乘法指令,64位有符號乘加指令SMLAL指令將Rm和Rs中的值作有符號數相乘,64位乘積與RdHi、RdLo相加,結果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,
50、Rs不能為R15。 RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標志C和V不確定。指令格式如下: SMLALcondS RdLo,RdHi,Rm,Rs 應用示例: SMLALR2,R3,R7,R6; (R3、R2)=R7R6+(R3、R2),1 ARM指令集介紹,ARM指令集分支指令,在ARM中有兩種方式可以實現(xiàn)程序的跳轉,一種是使用分支指令直接跳轉,另一種則是直接向PC寄存器賦值實現(xiàn)跳轉。 分支指令有以下三種: 分支指令B; 帶鏈接的分支指令BL; 帶狀態(tài)切換的分支指令BX。,ARM分支指令指令編碼,分支指令B/BL指令編碼格式,指令執(zhí)行的條件碼,L區(qū)別B指令(L為
51、0)和BL指令(L為1),24位有符號立即數(偏移量),分支指令BX指令編碼格式,指令執(zhí)行的條件碼,Rm目標地址寄存器,該寄存器裝載跳轉地址,ARM指令分支指令,ARM指令分支指令,分支指令B指令,該指令跳轉范圍限制在當前指令的32M字節(jié)地址內(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下: Bcond Label 例:B WAITA; 跳轉到WAITA標號處 B0 x1234; 跳轉到絕對地址0 x1234處,ARM指令分支指令,帶鏈接的分支指令BL指令適用于子程序調用,使用該指令后,下一條指令的地址被拷貝到R14(即LR) 連接寄存器中,然后跳轉到指定地址運行程序。跳轉范圍限制
52、在當前指令的32M字節(jié)地址內。指令格式如下: BLcond Label,Addr1,Addr2,1.當程序執(zhí)行到BL跳轉指令時,硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉地址裝入程序計數器(PC),2. 程序跳轉到目標地址Label繼續(xù)執(zhí)行,當子程序執(zhí)行結束后,將LR寄存器內容存入PC,返回調用函數繼續(xù)執(zhí)行,應用示例(調用子程序): BL Label,ARM指令分支指令,帶狀態(tài)切換的分支指令BX指令,該指令可以根據跳轉地址(Rm)的最低位來切換處理器狀態(tài)。其跳轉范圍限制在當前指令的32M字節(jié)地址內(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下: BXcond Rm,A
53、RM指令分支指令,帶狀態(tài)切換的分支指令BX指令,該指令可以根據跳轉地址(Rm)的最低位來切換處理器狀態(tài)。其跳轉范圍限制在當前指令的32M字節(jié)地址內(ARM指令為字對齊,最低2位地址固定為0)。 Rm的位0不用作地址的一部分。若Rm的位0為1,則指令將CPSR中的標志T置位,且將目標地址的代碼解釋為Thumb代碼;若Rm的位0為0,則Rm的位1就不能為1 。指令格式如下: BXcond Rm,例:ADRL R0,ThumbFun+1 ;將Thumb程序的入口地址加1存入R0 BX R0 ; 跳轉到R0指定的地址, ;并根據R0的最低位來切換處理器狀態(tài),1 ARM指令集介紹,ARM指令集雜項指令,
54、ARM指令集中有三條指令作為雜項指令,在實際應用中這三條指令非常重要。它們如下所示:,ARM雜項指令軟中斷指令,SWI指令用于產生SWI異常,使得CPU模式變換到管理模式,并且將CPSR保存到管理模式的SPSR中,然后程序跳轉到SWI異常入口。不影響條件碼標志。 該指令主要用于用戶程序調用操作系統(tǒng)的系統(tǒng)服務,操作系統(tǒng)在SWI異常處理程序中進行相應的系統(tǒng)服務。,SWIcondimmed_24,SWI指令格式,SWI指令編碼,指令執(zhí)行的條件碼,指令傳遞的參數(24位立即數,其值為02241),執(zhí)行時CPU忽略該參數。,ARM雜項指令軟中斷指令,根據SWI指令傳遞的參數SWI異常處理程序可以作出相應
55、的處理。SWI指令傳遞參數有以下兩種方法, 指令中的24位立即數指定了用戶請求的服務類型,參數通過通用寄存器傳遞。 MOV R0,#34;設置子功能號為34 SWI 12;調用12號軟中斷 指令中的24位立即數被忽略,用戶請求的服務類型由寄存器R0的值決定,參數通過其它的通用寄存器傳遞。 MOV R0,#12;調用12號軟中斷 MOV R1,#34;設置子功能號為34 SWI 0,ARM雜項指令軟中斷指令,在SWI異常中斷處理程序中,取出SWI指令中立即數的步驟為: 首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可通過對SPSR訪問得到; 然后取得該SWI指令的地址,這可通過
56、訪問LR寄存器得到; 接著讀出該SWI指令,分解出立即數。,SWI_Handler STMFD SP!, R0-R3, R12, LR; 現(xiàn)場保護 MRS R0, SPSR ; 讀取SPSR STMFD SP!, R0 ; 保存SPSR TST R0, #0 x20 ; 測試T標志位 LDRNEH R0, LR,#-2 ; 若是Thumb指令,讀取指令碼(16位) BICNE R0, R0, #0 xFF00; 取得Thumb指令的8位立即數(低8位) LDREQ R0, LR,#-4 ; 若是ARM指令,讀取指令碼(32位) BICEQ R0, R0, #0 xFF000000 ; 取得AR
57、M指令的24位立即數(低24位) . LDMFD SP!, R0-R3, R12, PC; SWI異常中斷返回,NE:Z=0 EQ:Z=1,ARM雜項指令狀態(tài)寄存器讀指令,在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進行讀操作。通過讀CPSR可以了解當前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。該指令不影響條件碼。,MRScond Rd,psr,MRS指令格式,指令對應編碼,指令執(zhí)行的條件碼,目標寄存器,不能為R15,區(qū)別CPSR(為0)和SPSR(為1)寄存器,ARM雜項指令狀態(tài)寄存器讀指令,在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CP
58、SR和SPSR進行讀操作。通過讀CPSR可以了解當前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。,MRScond Rd,psr,MRS指令格式,應用示例: MRS R1,CPSR; 將CPSR狀態(tài)寄存器讀取,保存到R1中 MRS R2,SPSR; 將SPSR狀態(tài)寄存器讀取,保存到R2中,ARM雜項指令狀態(tài)寄存器寫指令,在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。,MSRcond psr_fields,#imme
59、d_8r,MSR指令格式1,MSRcond psr_fields,Rm,MSR指令格式2,指令執(zhí)行的條件碼,CPSR或SPSR,指定傳送的區(qū)域,可以為以下字母(必須小寫)的一個或者組合: c 控制域屏蔽字節(jié)(psr7.0) x 擴展域屏蔽字節(jié)(psr15.8) s 狀態(tài)域屏蔽字節(jié)(psr23.16) f 標志域屏蔽字節(jié)(psr31.24),保存要傳送到狀態(tài)寄存器指定域數據的源寄存器,要傳送到狀態(tài)寄存器指定域的立即數,ARM雜項指令狀態(tài)寄存器寫指令,在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年云服務監(jiān)控協(xié)議
- 2025年垃圾處理和解協(xié)議
- 2025年混合贈與合同與贈與稅
- 2025版協(xié)議離婚法律援助與調解服務協(xié)議3篇
- 2025版專業(yè)幼兒園托管班教師職位聘用合同3篇
- 2025年度社保代繳及企業(yè)年金補充管理服務合同4篇
- 2025年度私人民間借款個人專利抵押借款合同
- 2025年度電子商務職業(yè)經理人市場運營聘用合同
- 2025年度民辦非企業(yè)文化交流捐贈協(xié)議書編制指南4篇
- 二零二五年度企業(yè)級UPS電源采購與綠色認證合同3篇
- 第1課 隋朝統(tǒng)一與滅亡 課件(26張)2024-2025學年部編版七年級歷史下冊
- 2025-2030年中國糖醇市場運行狀況及投資前景趨勢分析報告
- 冬日暖陽健康守護
- 水處理藥劑采購項目技術方案(技術方案)
- 2024級高一上期期中測試數學試題含答案
- 山東省2024-2025學年高三上學期新高考聯(lián)合質量測評10月聯(lián)考英語試題
- 不間斷電源UPS知識培訓
- 三年級除法豎式300道題及答案
- 品學課堂新范式
- GB/T 1196-2023重熔用鋁錠
- 幼兒園教師培訓:計數(數數)的核心經驗
評論
0/150
提交評論