嵌入式系统教案 武汉创维特信息技术有限公司 2019/1/18
提綱 第三章 ARM指令分類及定址方式 1 ARM 微處理器指令的分類 2 ARM 微處理器指令的條件域 3 ARM 微處理器指令的定址方式
ARM微處理器的指令系統 ARM微處理器指令的分類 跳躍指令 資料處理指令 程式狀態暫存器(PSR)處理指令 載入/儲存指令 輔助運算器指令和異常産生指令
ARM微處理器指令表-1 ARM微處理器指令的分類 助記符 指令功能描述 ADC 帶進位加法指令 ADD 加法指令 AND 邏輯與指令 B 跳躍指令(JMP) BIC 位清零指令 BL 呼叫副程式(CALL)指令 BLX 呼叫副程式和狀態切換的跳躍指令 BX 帶狀態切換的跳躍指令
ARM微處理器指令表-2 ARM微處理器指令的分類 助記符號 指令功能描述 CDP 輔助運算器資料操作指令 CMN 比較反值指令 CMP 比較指令 EOR XOR指令 LDC 記憶體到輔助運算器的資料傳輸指令 LDM 載入多個暫存器指令 LDR 記憶體到暫存器的資料傳輸指令 MCR ARM暫存器到輔助運算器之暫存器資料傳輸
ARM微處理器指令表-3 ARM微處理器指令的分類 助記符 指令功能描述 MLA 乘加運算指令 MOV 資料傳送指令 MRC MRS 傳送CPSR或SPSR的內容到通用暫存器 MSR 傳送通用暫存器到CPSR或SPSR的指令 MUL 32位乘法指令 32位乘加指令 MVN 資料取反傳送指令
ARM微處理器指令表-4 ARM微處理器指令的分類 助記符 指令功能描述 ORR 邏輯或指令 RSB 逆向减法指令 RSC 帶借位的逆向减法指令 SBC 帶借位减法指令 STC 輔助運算器暫存器寫入儲存器指令 STM 批量記憶體字寫入指令 STR 暫存器到記憶體的資料傳輸指令 SUB 减法指令
ARM微處理器指令表-5 ARM微處理器指令的分類 助記符 指令功能描述 SWI 軟體中斷指令 SWP 交換指令 TEQ 相等測試指令 TST 位測試指令
ARM微處理器指令的分類 指令的條件欄位 當處理器工作在ARM狀態時,幾乎所有的指令均根據CPSR中條件碼的狀態和指令的條件欄位,作有條件的執行。當指令的執行條件滿足時,指令被執行,否則指令被忽略。 Ex. ADDNE R0,R0,R1 每一條ARM指令包含4位元的條件碼,位於指令的最高4位元[31:28]。條件碼共有16種,每種條件碼可用兩個字元表示,這兩個字元可以附加在指令助記符號的後面和指令同時使用。例如,跳躍指令B可以加上尾碼EQ變爲BEQ表示“相等則跳躍”,即當CPSR中的Z標誌置位元時發生跳躍 Ex. BEQ JP_Lable
指令的條件欄位表-1 ARM微處理器指令的分類 條件碼 尾碼 標 誌 含 義 0000 EQ Z置位 相等 0001 NE Z清零 不相等 0010 CS C置位 無符號數大於或等於 0011 CC C清零 無符號數小於 0100 MI N置位 負數 0101 PL N清零 正數或零 0110 VS V置位 溢位 0111 VC V清零 未溢位
指令的條件欄位表-2 ARM微處理器指令的分類 條件碼 尾碼 標 志 含 義 1001 LS C清零Z置位 1010 GE N等於V 無符號數小於或等於 1010 GE N等於V 帶符號數大於或等於 1011 LT N不等於V 帶符號數小於 1100 GT Z清零且(N等於V) 帶符號數大於 1101 LE Z置位或(N不等於V) 帶符號數小於或等於 1110 AL 忽略 無條件執行
ARM指令的定址方式 ARM微處理器指令的定址方式 ARM指令系統支援如下幾種常見的定址方式: 立即定址 暫存器定址 暫存器間接定址 基址變址定址 多暫存器定址 相對定址 堆疊定址
ARM微處理器指令的定址方式 立即定址 立即定址,這是一種特殊的定址方式,運算元本身就在指令中給出,只要取出指令也就取到了運算元。這個運算元被稱爲立即值,對應的定址方式也就叫做立即定址。例如以下指令 : ADD R0,R0,#1 /*R0←R0+1*/ ADD R0,R0,#0x3f /*R0←R0+0x3f*/ 在以上兩條指令中,第二個源運算元即爲立即值,要求以“#”爲字首,對於以十六進位表示的立即值,需在“#”後加上“0x ”。
ARM微處理器指令的定址方式 暫存器定址 暫存器定址就是利用暫存器中的數值作爲運算元,這種定址方式是各類微處理器經常採用的一種方式,也是一種執行效率較高的定址方式。以下指令 : ADD R0,R1,R2 /*R0←R1+R2*/ 該指令的執行效果是將暫存器R1和R2的內容相加,其結果存放在暫存器R0中 。
暫存器間接定址 ARM微處理器指令的定址方式 暫存器間接定址就是以暫存器中的值作爲運算元的地址,而運算元本身存放在記憶體中。例如以下指令 : ADD R0,R1,[R2] /*R0←R1+[R2]*/ LDR R0,[R1] /*R0←[R1]*/ STR R0,[R1] /*[R1]←R0*/ 在第一條指令中,以暫存器R2的值作爲運算元的地址,在記憶體中取得一個運算元後與R1相加,結果存入暫存器R0中 ; 第二條指令將以R1的值爲位址的記憶體中的資料傳送到R0中 。 第三條指令將R0的值傳送到以R1的值爲地址的記憶體中。
基址變址定址 ARM微處理器指令的定址方式 基址變址定址就是將暫存器(該暫存器一般稱作基址暫存器)的內容與指令中給出的位址偏移量相加,從而得到一個運算元的有效地址。變址定址方式常用於存取某基底位址附近的地址單元。採用變址定址方式的指令常見有以下幾種形式 ,如下所示: LDR R0,[R1,#4] ;R0←[R1+4] LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4 LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4 LDR R0,[R1,R2] ;R0←[R1+R2] 在第一條指令中,將暫存器R1的內容加上4形成運算元的有效地址,從而取得運算元存入暫存器 R0中。 在第二條指令中,將暫存器R1的內容加上4形成運算元的有效地址,從而取得運算元存入暫存器R0中,然後,R1的內容自增4個位元組 。 在第三條指令中,以暫存器R1的內容作爲運算元的有效地址,從而取得運算元存入暫存器R0中,然後,R1的內容自增4個位元組 。 在第四條指令中,將暫存器R1的內容加上暫存器R2的內容形成運算元的有效位址,從而取得運算元存入暫存器R0中。
多暫存器定址 ARM微處理器指令的定址方式 採用多暫存器定址方式,一條指令可以完成多個暫存器值的傳送。這種定址方式可以用一條指令完成傳送最多16個通用暫存器的值 。以下指令: LDMIA R0,{R1,R2,R3,R4} ;R1←[R0] ;R2←[R0+4] ;R3←[R0+8] ;R4←[R0+12] 該指令的尾碼IA表示在每次執行完載入/儲存操作後,R0按字長度增加,因此,指令可將連續儲存單元的值傳送到R1 ~R4。
ARM微處理器指令的定址方式 相對定址 與基址變址定址方式相類似,相對定址以程式計數器PC的當前值爲基底位址,指令中的位址標號作爲偏移量,將兩者相加之後得到運算元的有效地址。以下程式段完成副程式的調用和返回,跳躍指令BL採用了相對定址方式: BL NEXT ;跳躍到副程式NEXT處執行 …… NEXT MOV PC,LR ;從副程式返回
ARM微處理器指令的定址方式 堆疊定址 堆疊是一種資料結構,按先進後出(First In Last Out,FILO)的方式工作,使用一個稱作堆疊指標的專用暫存器指出當前的操作位置,堆疊指標總是指向堆疊頂 。 當堆疊指標指向最後壓入堆疊的資料時,稱爲滿堆疊(Full Stack),而當堆疊指標指向下一個將要放入資料的空位置時,稱爲空堆疊 (Empty Stack)。
ARM微處理器指令的定址方式 堆疊定址 根據堆疊的生成方式,又可以分爲遞增堆疊(Ascending Stack)和遞減堆疊(Descending Stack),當堆疊由低位址向高位址生成時,稱爲遞增堆疊,當堆疊由高位址向低位址成長時,稱爲遞減堆疊。這樣就有四種類型的堆疊工作方式滿遞增堆疊:堆疊指標指向最後壓入的数值,且由低位址向高位址成長。 滿遞減堆疊:堆疊指標指向最後壓入的資料,且由高位址向低位址成長。 空遞增堆疊:堆疊指標指向下一個將要放入資料的空位置,且由低位址向高地址成長。 空遞減堆疊:堆疊指標指向下一個將要放入資料的空位置,且由高位址向低地址成長成
多暫存器用法 LDMIA R0!,{R3-R9} ;Inc. After STMIB R0!,{R0-R3, R7} ; Inc. Before LDADA STMDB LDMFD = DB STMED = DA LDMFA = IB LDMEA = IA Ex. 記憶體內容搬移 LDR R0,=SrcData LDR R1,=DstData LDMIA R0!,{R2-R9} STMIA R1!,{R2-R9} Ex. 暫存器儲存 STMED SP!,{R0-R4,LR} … LDMFD SP!,{R0-R4,PC}