培訓(xùn)課件ARM嵌入式系統(tǒng)基礎(chǔ)教程-ARM7TDMI(-S)指令系統(tǒng)尋址方式和嵌入式程序設(shè)計、操作系_第1頁
培訓(xùn)課件ARM嵌入式系統(tǒng)基礎(chǔ)教程-ARM7TDMI(-S)指令系統(tǒng)尋址方式和嵌入式程序設(shè)計、操作系_第2頁
培訓(xùn)課件ARM嵌入式系統(tǒng)基礎(chǔ)教程-ARM7TDMI(-S)指令系統(tǒng)尋址方式和嵌入式程序設(shè)計、操作系_第3頁
培訓(xùn)課件ARM嵌入式系統(tǒng)基礎(chǔ)教程-ARM7TDMI(-S)指令系統(tǒng)尋址方式和嵌入式程序設(shè)計、操作系_第4頁
培訓(xùn)課件ARM嵌入式系統(tǒng)基礎(chǔ)教程-ARM7TDMI(-S)指令系統(tǒng)尋址方式和嵌入式程序設(shè)計、操作系_第5頁
已閱讀5頁,還剩159頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第3章

ARM7TDMI(-S)指令系統(tǒng)1完整版pt1.ARM程序的文件類型:C程序:ARM開發(fā)中大部分程序使用C語言編寫,文件類型為“*.C”;匯編程序:涉及到硬件底層操作的代碼有時必須使用匯編語言編寫,文件類型為“*.S”。2.為什么學(xué)習(xí)ARM指令系統(tǒng):操作系統(tǒng)移植編寫啟動代碼方便程序調(diào)試前言2完整版pt1.ARM處理器的尋址方式;2.ARM指令的特點;3.ARM指令的種類,它能完成哪些功能。本章學(xué)習(xí)重點3完整版pt目錄1.ARM處理器尋址方式2.指令集介紹ARM指令集Thumb指令集4完整版pt目錄1.ARM處理器尋址方式2.指令集介紹ARM指令集Thumb指令集5完整版pt第3章ARM7TDMI(-S)指令系統(tǒng)簡介ARM處理器是基于精簡指令集計算機(RISC)原理設(shè)計的,指令集和相關(guān)譯碼機制較為簡單。ARM7TDMI(-S)具有32位ARM指令集和16位Thumb指令集,ARM指令集效率高,但是代碼密度低;而Thumb指令集具有較高的代碼密度,卻仍然保持ARM的大多數(shù)性能上的優(yōu)勢,它是ARM指令集的子集。所有的ARM指令都是可以有條件執(zhí)行的,而Thumb指令僅有一條指令具備條件執(zhí)行功能。ARM程序和Thumb程序可相互調(diào)用,相互之間的狀態(tài)切換開銷幾乎為零。6完整版pt第3章ARM7TDMI(-S)指令系統(tǒng)ARM指令集與Thumb指令集的關(guān)系Thumb指令集具有靈活、小巧的特點ARM指令集支持ARM核所有的特性,具有高效、快速的特點7完整版pt3.1ARM處理器尋址方式尋址方式分類尋址方式是根據(jù)指令中給出的地址碼字段來實現(xiàn)尋找真實操作數(shù)地址的方式。ARM處理器具有8種基本尋址方式。1.寄存器尋址; 2.立即尋址;3.寄存器移位尋址; 4.寄存器間接尋址;5.基址尋址; 6.多寄存器尋址;7.堆棧尋址; 8.相對尋址。8完整版pt操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執(zhí)行時直接取出寄存器值來操作。寄存器尋址指令舉例如下:MOVR1,R2 ;將R2的值存入R1SUBR0,R1,R2;將R1的值減去R2的值,結(jié)果保存到R0

0xAA0x55R2R13.1ARM處理器尋址方式尋址方式分類——寄存器尋址MOVR1,R20xAA9完整版pt立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(shù)本身,也就是說,數(shù)據(jù)就包含在指令當中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱為立即數(shù))。立即尋址指令舉例如下:SUBS R0,R0,#1;R0減1,結(jié)果放入R0,并且影響標志位MOV R0,#0xFF000;將立即數(shù)0xFF000裝入R0寄存器

0x55R0MOVR0,#0xFF00程序存儲3.1ARM處理器尋址方式尋址方式分類——立即尋址MOVR0,#0xFF000xFF00從代碼中獲得數(shù)據(jù)10完整版pt寄存器移位尋址是ARM指令集特有的尋址方式。當?shù)?個操作數(shù)是寄存器移位方式時,第2個寄存器操作數(shù)在與第1個操作數(shù)結(jié)合之前,選擇進行移位操作。寄存器移位尋址指令舉例如下:MOV R0,R2,LSL#3

;R2的值左移3位,結(jié)果放入R0, ;即是R0=R2×8ANDS R1,R1,R2,LSLR3

;R2的值左移R3位,然后和R1相 ;“與”操作,結(jié)果放入R10x55R0R20x013.1ARM處理器尋址方式尋址方式分類——寄存器移位尋址MOVR0,R2,LSL#30x080x08邏輯左移3位11完整版pt寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數(shù)保存在寄存器指定地址的存儲單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下:LDR R1,[R2] ;將R2指向的存儲單元的數(shù)據(jù)讀出 ;保存在R1中SWP R1,R1,[R2] ;將寄存器R1的值和R2指定的存儲 ;單元的內(nèi)容交換0x55R0R20x400000000xAA0x400000003.1ARM處理器尋址方式尋址方式分類——寄存器間接尋址LDRR0,[R2]0xAA12完整版pt基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址。基址尋址用于訪問基址附近的存儲單元,常用于查表、數(shù)組操作、功能部件寄存器訪問等?;穼ぶ分噶钆e例如下:LDR R2,[R3,#0x0C] ;讀取R3+0x0C地址上的存儲單元 ;的內(nèi)容,放入R2STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值寄存 ;到保存到R0指定的存儲單元3.1ARM處理器尋址方式尋址方式分類——基址尋址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA將R3+0x0C作為地址裝載數(shù)據(jù)13完整版pt多寄存器尋址一次可傳送幾個寄存器值,允許一條指令傳送16個寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下:LDMIA R1!,{R2-R7,R12};將R1指向的單元中的數(shù)據(jù)讀出到 ;R2~R7、R12中(R1自動加1)STMIA R0!,{R2-R7,R12};將寄存器R2~R7、R12的值保 ;存到R0指向的存儲;單元中 ;(R0自動加1)0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存儲器3.1ARM處理器尋址方式尋址方式分類——多寄存器尋址LDMIAR1!,{R2-R4,R6}0x010x020x030x040x4000001014完整版pt堆棧是一個按特定順序進行存取的存儲區(qū),操作順序為“后進先出”。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區(qū)域(堆棧),指針所指向的存儲單元即是堆棧的棧頂。存儲器堆棧可分為兩種:向上生長:向高地址方向生長,稱為遞增堆棧向下生長:向低地址方向生長,稱為遞減堆棧3.1ARM處理器尋址方式尋址方式分類——堆棧尋址15完整版pt3.1ARM處理器尋址方式尋址方式分類——堆棧尋址棧底棧頂棧區(qū)SP

堆棧存儲區(qū)棧頂棧底棧區(qū)

SP向下增長向上增長0x123456780x12345678堆棧壓棧堆棧壓棧16完整版pt棧頂SP

棧頂SP

棧底空堆棧棧底滿堆棧堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項,稱為滿堆棧;堆棧指針指向下一個待壓入數(shù)據(jù)的空位置,稱為空堆棧。3.1ARM處理器尋址方式尋址方式分類——堆棧尋址0x123456780x12345678棧頂SP

0x12345678棧頂SP

壓棧壓棧17完整版pt所以可以組合出四種類型的堆棧方式:滿遞增:堆棧向上增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最高地址。指令如LDMFA、STMFA等;空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如LDMEA、STMEA等;滿遞減:堆棧向下增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最低地址。指令如LDMFD、STMFD等;空遞減:堆棧向下增長,堆棧指針向堆棧下的第一個空位置。指令如LDMED、STMED等。STMFDSP!,{R1-R7,LR}LDMFDSP!,{R1-R7,LR}3.1ARM處理器尋址方式尋址方式分類——堆棧尋址18完整版pt相對尋址是基址尋址的一種變通。由程序計數(shù)器PC提供基準地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對尋址指令舉例如下: BL SUBR1 ;調(diào)用到SUBR1子程序 BEQ LOOP ;條件跳轉(zhuǎn)到LOOP標號處 ...LOOP MOV R6,#1 ...SUBR1 ...3.1ARM處理器尋址方式尋址方式分類——相對尋址19完整版pt1.ARM處理器的尋址方式

——8種尋址方式;2.ARM指令的特點;3.ARM指令的種類,它能完成哪些功能。本章學(xué)習(xí)重點20完整版pt目錄1.ARM處理器尋址方式2.指令集介紹ARM指令集Thumb指令集21完整版pt簡單的ARM程序;文件名:TEST1.S

;功能:實現(xiàn)兩個寄存器相加;說明:使用ARMulate軟件仿真調(diào)試 AREA Example1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標識程序入口 CODE32 ;聲明32位ARM指令START MOV R0,#0 ;設(shè)置參數(shù) MOV R1,#10LOOP BL ADD_SUB ;調(diào)用子程序ADD_SUB B LOOP ;跳轉(zhuǎn)到LOOPADD_SUB

ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回 END ;文件結(jié)束使用“;”進行注釋標號頂格寫實際代碼段聲明文件結(jié)束22完整版pt;文件名:TEST1.S

;功能:實現(xiàn)兩個寄存器相加;說明:使用ARMulate軟件仿真調(diào)試 AREA Example1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標識程序入口 CODE32 ;聲明32位ARM指令START MOV R0,#0 ;設(shè)置參數(shù) MOV R1,#10LOOP BL ADD_SUB ;調(diào)用子程序ADD_SUB B LOOP ;跳轉(zhuǎn)到LOOPADD_SUB

ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回 END ;文件結(jié)束簡單的ARM程序23完整版pt目錄1.ARM處理器尋址方式2.指令集介紹ARM指令集Thumb指令集24完整版ptARM指令小節(jié)目錄1.指令格式2.條件碼3.ARM指令25完整版ptARM指令小節(jié)目錄1.指令格式2.條件碼3.ARM指令26完整版ptARM指令的基本格式如下:3.2指令集介紹ARM指令集——指令格式<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}其中<>號內(nèi)的項是必須的,{}號內(nèi)的項是可選的。各項的說明如下:opcode:指令助記符; cond:執(zhí)行條件;S:是否影響CPSR寄存器的值;Rd:目標寄存器; Rn:第1個操作數(shù)的寄存器;operand2:第2個操作數(shù);27完整版ptARM指令的基本格式如下:3.2指令集介紹ARM指令集——第2個操作數(shù)<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}靈活的使用第2個操作數(shù)“operand2”能夠提高代碼效率。它有如下的形式:#immed_8r——常數(shù)表達式;Rm——寄存器方式;Rm,shift——寄存器移位方式;28完整版pt3.2指令集介紹ARM指令集——第2個操作數(shù)#immed_8r——常數(shù)表達式該常數(shù)必須對應(yīng)8位位圖,即必須是一個8位的常數(shù)通過循環(huán)右移偶數(shù)位可以得到的數(shù)。循環(huán)右移10位0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x0400000100移位前的8位常數(shù)0x12移位后得到的常數(shù)0x0480000029完整版pt3.2指令集介紹ARM指令集——第2個操作數(shù)#immed_8r——常數(shù)表達式該常數(shù)必須對應(yīng)8位位圖,即必須是一個8位的常數(shù)通過循環(huán)右移偶數(shù)位可以得到的數(shù)。例如:MOV R0,#1AND R1,R2,#0x0FMOV R1,#0xC000 ;0xC000可由0x03循環(huán)右移16位得到30完整版pt√可以由0x4A循環(huán)右移10位得到×2.請列舉2個8位圖立即數(shù)?思考與練習(xí)?1.以下8位圖立即數(shù)是否合法?0x0103C0000x128000000x4000003B(0xED循環(huán)右移2位)0x0016C000(0x5B循環(huán)右移18位)31完整版pt3.2指令集介紹ARM指令集——第2個操作數(shù)Rm——寄存器方式在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。例如:SUB R1,R1,R2MOV PC,R032完整版pt3.2指令集介紹ARM指令集——第2個操作數(shù)Rm,shift——寄存器移位方式將寄存器的移位結(jié)果作為操作數(shù),但Rm值保持不變,移位方法如下:操作碼說明操作碼說明ASR#n算術(shù)右移n位ROR#n循環(huán)右移n位LSL#n邏輯左移n位RRX帶擴展的循環(huán)右移1位LSR#n邏輯右移n位TypeRsType為移位的一種類型,Rs為偏移量寄存器,低8位有效。33完整版pt3.2指令集介紹ARM指令集——第2個操作數(shù)LSL移位操作:0LSR移位操作:0ASR移位操作:ROR移位操作:RRX移位操作:C34完整版pt3.2指令集介紹ARM指令集——第2個操作數(shù)Rm,shift——寄存器移位方式例如:ADD R1,R1,R1,LSL#3 ;R1=R1+R1*8=9R1SUB R1,R1,R2,LSRR3 ;R1=R1-(R2/2R3)35完整版ptARM指令小節(jié)目錄1.指令格式2.條件碼3.ARM指令36完整版ptARM指令的基本格式如下:3.2指令集介紹ARM指令集——條件碼<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}使用條件碼“cond”可以實現(xiàn)高效的邏輯操作,提高代碼效率。絕大部分的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉(zhuǎn))指令具有條件執(zhí)行功能。如果指令不標明條件代碼,將默認為無條件(AL)執(zhí)行。37完整版pt操作碼條件助記符標志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號數(shù)大于或等于0011CC/LOC=0無符號數(shù)小于0100MIN=1負數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號數(shù)大于1001LSC=0,Z=1無符號數(shù)小于或等于1010GEN=V有符號數(shù)大于或等于

1011LTN!=V有符號數(shù)小于

1100GTZ=0,N=V有符號數(shù)大于

1101LEZ=1,N!=V有符號數(shù)小于或等于

1110AL任何無條件執(zhí)行(指令默認條件)1111NV任何從不執(zhí)行(不要使用)指令條件碼表38完整版pt3.2指令集介紹ARM指令集——條件碼C代碼:if(a>b) a++;else b++;對應(yīng)的匯編代碼:CMP R0,R1 ;R0與R1比較ADDHI R0,R0,#1;若R0>R1,則R0=R0+1ADDLS R1,R1,#1;若R0≤R1,則R1=R1+1示例:39完整版pt1.ARM處理器的尋址方式

——8種尋址方式;2.ARM指令的特點

——可條件執(zhí)行、可選擇影響標志位、具有非常靈活的第二操作數(shù);3.ARM指令的種類,它能完成哪些功能。本章學(xué)習(xí)重點40完整版ptARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令41完整版pt

為什么要掌握部分常用ARM指令?熟悉ARM體系結(jié)構(gòu):通過指令的學(xué)習(xí)可以更深入的了解ARM硬件結(jié)構(gòu)的特點;修改啟動代碼:啟動代碼為了滿足大部分系統(tǒng)的順利運行,通常將系統(tǒng)硬件配置在最低性能,通過調(diào)整啟動代碼中的參數(shù)使其更適合自己的硬件系統(tǒng);調(diào)試程序:通過觀察反匯編代碼了解程序執(zhí)行情況,比如某個變量的操作是否被編譯器優(yōu)化掉了。閱讀已有的匯編代碼;42完整版ptARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令43完整版ptARM指令集表44完整版pt3.2指令集介紹ARM指令集——存儲器訪問指令A(yù)RM處理器是典型的RISC處理器,對存儲器的訪問只能使用加載和存儲指令實現(xiàn)。ARM處理器是馮?諾依曼存儲結(jié)構(gòu),程序空間、RAM空間及I/O映射空間統(tǒng)一編址,除對RAM操作以外,對外圍IO、程序數(shù)據(jù)的訪問也要通過加載/存儲指令進行。存儲器訪問指令分為單寄存器操作指令和多寄存器操作指令。45完整版ptLDR/STR指令用于對內(nèi)存變量的訪問、內(nèi)存緩沖區(qū)數(shù)據(jù)的訪問、查表、外圍部件的控制操作等。若使用LDR指令加載數(shù)據(jù)到PC寄存器,則實現(xiàn)程序跳轉(zhuǎn)功能,這樣也就實現(xiàn)了程序散轉(zhuǎn)。所有單寄存器加載/存儲指令可分為“字和無符號字節(jié)加載存儲指令”和“半字和有符號字節(jié)加載存儲指令。3.2指令集介紹ARM存儲器訪問指令——單寄存器存取46完整版pt3.2指令集介紹ARM存儲器訪問指令——單寄存器存取裝載指令:LDR目標寄存器,源地址存儲指令:STR源寄存器,目標地址存儲器源地址目標寄存器存儲器目標地址源寄存器47完整版pt3.2指令集介紹ARM存儲器訪問指令——單寄存器存取裝載指令:LDR存儲指令:STRxxLDR/STR指令搭配不同的后綴實現(xiàn)不同方式的單寄存器存取操作:字/半字/字節(jié)數(shù)據(jù)控制是/否用戶模式控制無/有符號控制48完整版pt助記符說明操作條件碼位置LDRRd,addressing加載字數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}LDRBRd,addressing加載無符號字節(jié)數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}BLDRTRd,addressing以用戶模式加載字數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}TLDRBTRd,addressing以用戶模式加載無符號字節(jié)數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}BTLDRHRd,addressing加載無符號半字數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}HLDRSBRd,addressing加載有符號字節(jié)數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}SBLDRSHRd,addressing加載有符號半字數(shù)據(jù)

Rd←[addressing],addressing索引

LDR{cond}SHARM存儲器訪問指令——裝載指令49完整版pt助記符說明操作條件碼位置STRRd,addressing存儲字數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}STRBRd,addressing存儲字節(jié)數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}BSTRTRd,addressing以用戶模式存儲字數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}TSTRBTRd,addressing以用戶模式存儲字節(jié)數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}BTSTRHRd,addressing存儲半字數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}HARM存儲器訪問指令——保存指令50完整版ptARM存儲器訪問指令——地址形式裝載指令:LDR目標寄存器,源地址保存指令:STR源寄存器,目標地址立即數(shù):立即數(shù)可以是一個無符號的數(shù)值。這個數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。如:LDRR1,[R0,#0x12]

寄存器:寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。如:LDRR1,[R0,R2]

寄存器及移位常數(shù):寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。如:LDRR1,[R0,R2,LSL

#2]51完整版ptARM存儲器訪問指令——尋址方式裝載指令:LDR目標寄存器,源地址保存指令:STR源寄存器,目標地址零偏移:如:LDRRd,[Rn]前索引偏移: 如:LDRRd,[Rn,#0x04]!程序相對偏移: 如:LDRRd,labe1

后索引偏移:

如:LDRRd,[Rn],#0x04注意:大多數(shù)情況下,必須保證字數(shù)據(jù)操作的地址是32位對齊的。52完整版ptLDR/STR字數(shù)據(jù)加載/存儲指令cond:指令執(zhí)行的條件編碼I、P、U、W:用于區(qū)別不同的地址模式(偏移量)。I為0時,偏移量為12位立即數(shù);I為1時,偏移量為寄存器移位。P表示前/后索引,U表示加/減,W表示地址回寫。L:L為1表示加載,L為0表示存儲。B:B為1表示字節(jié)訪問,B為0表示字訪問Rd:源/目標寄存器Rn:基址寄存器addr_mode:表示偏移量,是一個12位的無符號二進制數(shù),與Rn一起構(gòu)成地址addr。53完整版pt0x55R2R50x400000000x123456780x40000000存儲器地址應(yīng)用示例:LDR R2,[R5]

;將R5指向地址的字數(shù)據(jù)存入R20x12345678ARM存儲器訪問指令——單寄存器轉(zhuǎn)載應(yīng)用54完整版pt0x12345678R1R20x400000000x??0x40000004存儲器地址應(yīng)用示例:STR R1,[R2,#0x04]

;將R1的數(shù)據(jù)存儲到R0+0x04地址0x12345678+4ARM存儲器訪問指令——單寄存器保存應(yīng)用55完整版pt課堂練習(xí):指令的正誤LDRR1,[R2,R5]!STRR2,[R3],#0xFFFF8STREQR4,[R0,R4,LSLR5]LDRR4,[R0,R1,LSL#32]STREQR3,[R6],#-0x08LDRR0,[R2]!,-R6LDRR4,STARTLDRR1,[SP,#-0x04]STRR1,STARTLDRPC,R6LDRPC,[R6]LDRR1,[R3,R15];錯誤,R15不可作為偏移寄存器

;正確;錯誤,超出了立即數(shù)的范圍;錯誤,不能用寄存器表示移位的位數(shù);錯誤,超出了移位的范圍;正確;錯誤,后索引不用!后綴;正確;正確;格式正確,但必須保證標號處可以存儲數(shù)據(jù);錯誤,R6不表示一個存儲地址;正確56完整版pt中斷向量代碼57完整版pt3.2指令集介紹ARM存儲器訪問指令——多寄存器存取多寄存器加載/存儲指令可以實現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。LDM為加載多個寄存器;STM為存儲多個寄存器。允許一條指令傳送16個寄存器的任何子集或所有寄存器。它們主要用于現(xiàn)場保護、數(shù)據(jù)復(fù)制、常數(shù)傳遞等。58完整版pt3.2指令集介紹ARM存儲器訪問指令——多寄存器存取裝載指令:LDM

源地址,目標寄存器列表存儲指令:STM

目標地址,源寄存器列表存儲器源地址目標寄存器1目標寄存器n存儲器目標地址源寄存器1源寄存器n59完整版pt3.2指令集介紹ARM存儲器訪問指令——多寄存器存取裝載指令:LDM存儲指令:STMxxLDM/STM指令搭配不同的后綴實現(xiàn)不同方式地址增長方式:IA:每次傳送后地址加4IB:每次傳送前地址加4DA:每次傳送后地址減4DB:每次傳送前地址減460完整版ptARM存儲器訪問指令——多寄存器存取數(shù)據(jù)塊傳送指令操作過程如右圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1’則為指令執(zhí)行后的基址寄存器。R5R6R7R1

R1’

指令STMIAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1

R1’

指令STMDAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1

R1’

指令STMIB

R1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1’

R1

指令STMDBR1!,{R5-R7}4008H4004H4000H4014H4010H400CH61完整版pt3.2指令集介紹ARM存儲器訪問指令——多寄存器存取多寄存器存取指令與堆棧操作指令的關(guān)系如下表所示。模式說明模式說明IA每次傳送后地址加4FD滿遞減堆棧IB每次傳送前地址加4ED空遞減堆棧DA每次傳送后地址減4FA滿遞增堆棧DB每次傳送前地址減4EA空遞增堆棧數(shù)據(jù)塊傳送操作堆棧操作62完整版pt3.2指令集介紹ARM存儲器訪問指令——多寄存器存取多寄存器存取指令與堆棧操作指令的關(guān)系如下表所示。數(shù)據(jù)塊傳送存儲堆棧操作壓棧說明數(shù)據(jù)塊傳送加載堆棧操作出棧說明STMDASTMED空遞減LDMDALDMFA滿遞減STMIASTMEA空遞增LDMIALDMFD滿遞增STMDBSTMFD滿遞減LDMDBLDMEA空遞減STMIBSTMFA滿遞增LDMIBLDMED空遞增63完整版pt0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存儲器0x010x020x030x040x40000010應(yīng)用示例:LDMIAR1!,{R2-R4,R6}

將R1指向的內(nèi)存數(shù)據(jù)讀取到R0-R4和R6寄存器中ARM存儲器訪問指令——多寄存器存取64完整版pt應(yīng)用示例:STMFDSP!,{R0-R7,LR}ARM存儲器訪問指令——滿遞減壓棧操作棧頂0x01……0x07ARM7內(nèi)核內(nèi)部寄存器存儲器0x000x4020……R0R1R7SP0x??0x40040x40000x400C0x40080x??0x??0x??0x??0x??0x??0x??0x40140x40100x40200x4018地址0x??0x401C0x??0x3FFC0x01230x??0x3FF8LR1.壓棧操作前寄存器和堆棧區(qū)的狀態(tài);2.壓棧操作前堆棧指針指向棧頂;65完整版pt應(yīng)用示例:STMFDSP!,{R0-R7,LR}ARM存儲器訪問指令——滿遞減壓棧操作0x01……0x07ARM7內(nèi)核內(nèi)部寄存器存儲器0x000x4020……R0R1R7SP0x??0x40040x40000x400C0x40080x??0x??0x??0x??0x??0x??0x??0x40140x40100x40200x4018地址0x??0x401C0x??0x3FFC0x01230x??0x3FF8LR1.壓棧操作前寄存器和堆棧區(qū)的狀態(tài);2.壓棧操作前堆棧指針指向棧頂;3.執(zhí)行壓棧操作指令保存R0-R7和LR0x010x020x030x040x050x070x000x060x01230x3FFC棧頂66完整版pt應(yīng)用示例:LDMFDSP!,{R0-R7,PC}ARM存儲器訪問指令——滿遞減出棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指向棧頂;棧頂0x??0x??存儲器0x??0x??0x40040x40000x400C0x40080x??0x??0x??0x??0x??0x??0x??0x40140x40100x40200x4018地址0x??0x401C0x??0x3FFC0x??0x3FF80x010x020x030x040x050x070x000x060x0123……ARM7內(nèi)核0x4020……R0R1R7SP0x????LR0x3FFCPC0x????67完整版pt應(yīng)用示例:LDMFDSP!,{R0-R7,PC}ARM存儲器訪問指令——滿遞減出棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指向棧頂;棧頂0x??0x??存儲器0x??0x??0x40040x40000x400C0x40080x??0x??0x??0x??0x??0x??0x??0x40140x40100x40200x4018地址0x??0x401C0x??0x3FFC0x??0x3FF80x010x020x030x040x050x070x000x060x0123……ARM7內(nèi)核0x4020……R0R1R7SP0x????LR0x3FFCPC0x????3.執(zhí)行出棧操作指令恢復(fù)R0-R7和PC0x40200x010x070x000x010x020x030x040x050x070x000x060x01230x012368完整版pt帶狀態(tài)寄存器恢復(fù)的出棧操作:LDMFDSP!,{R0-R7,PC}^ARM存儲器訪問指令——滿遞減出棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指向棧頂;棧頂0x??0x??存儲器0x??0x??0x40040x40000x400C0x40080x??0x??0x??0x??0x??0x??0x??0x40140x40100x40200x4018地址0x??0x401C0x??0x3FFC0x??0x3FF80x010x020x030x040x050x070x000x060x0123……ARM7內(nèi)核0x4020……R0R1R7SP0x????LR0x3FFCPC0x????0x????CPSRSPSR0x????69完整版pt棧頂帶狀態(tài)寄存器恢復(fù)的出棧操作:LDMFDSP!,{R0-R7,PC}^ARM存儲器訪問指令——滿遞減出棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指向棧頂;0x??0x??存儲器0x??0x??0x40040x40000x400C0x40080x??0x??0x??0x??0x??0x??0x??0x40140x40100x40200x4018地址0x??0x401C0x??0x3FFC0x??0x3FF80x010x020x030x040x050x070x000x060x0123……ARM7內(nèi)核0x4020……R0R1R7SP0x????LR0x3FFCPC0x????0x????CPSRSPSR0x????0x40200x010x070x000x010x020x030x040x050x070x000x060x01230x01233.執(zhí)行出棧操作指令恢復(fù)R0-R7和PC70完整版pt3.2指令集介紹SWP指令用于將一個內(nèi)存單元(該單元地址放在寄存器Rn中)的內(nèi)容讀取到一個寄存器Rd中,同時將另一個寄存器Rm的內(nèi)容寫入到該內(nèi)存單元中。使用SWP可實現(xiàn)信號量操作。ARM存儲器訪問指令——寄存器和存儲器交換指令71完整版pt3.2指令集介紹ARM存儲器訪問指令——寄存器和存儲器交換指令裝載指令:SWP讀入寄存器,輸出寄存器,目標地址存儲器目標地址讀入寄存器輸出寄存器72完整版pt3.2指令集介紹ARM存儲器訪問指令——寄存器和存儲器交換指令裝載指令:SWP讀入寄存器,輸出寄存器,目標地址助記符說明操作條件碼位置SWPRd,Rm,Rn寄存器和存儲器字數(shù)據(jù)交換Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}SWPBRd,Rm,Rn寄存器和存儲器字節(jié)數(shù)據(jù)交換Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}B73完整版pt0x12345678R1R20x??0x112233440x40000000存儲器地址R00x400000003.2指令集介紹ARM存儲器訪問指令——寄存器和存儲器交換指令應(yīng)用示例:SWP R2,R1,[R0]將R1的內(nèi)容與R0指向的存儲單元的內(nèi)容進行交換0x123456780x1122334474完整版ptARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令75完整版pt3.2指令集介紹ARM指令集——ARM數(shù)據(jù)處理指令數(shù)據(jù)處理指令大致可分為3類:數(shù)據(jù)傳送指令;算術(shù)邏輯運算指令;比較指令。數(shù)據(jù)處理指令只能對寄存器的內(nèi)容進行操作,而不能對內(nèi)存中的數(shù)據(jù)進行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,并影響狀態(tài)標志。

76完整版pt

cond:指令執(zhí)行的條件碼I:用于區(qū)別第二操作數(shù)是立即數(shù)(I=1)還是寄存器移位(I=0)opcode:數(shù)據(jù)處理指令操作碼S:

用于設(shè)置條件碼,S=0,條件碼不改變,S=1,條件碼根據(jù)具體指令的結(jié)果修改Rn:第一操作數(shù)寄存器Rd:目標寄存器Operand2:第二操作數(shù),該數(shù)可以是立即數(shù)或寄存器移位數(shù)。

機器碼格式77完整版pt3.2指令集介紹數(shù)據(jù)傳送指令

MOV指令將8位圖立即數(shù)或寄存器傳送到目標寄存器(Rd),可用于移位運算等操作。裝載指令:MOV目標寄存器,操作數(shù)目標寄存器操作數(shù)78完整版pt3.2指令集介紹數(shù)據(jù)傳送指令

MOV指令將8位圖立即數(shù)或寄存器傳送到目標寄存器(Rd),可用于移位運算等操作。同類型的指令還有MVN,它可以實現(xiàn)數(shù)據(jù)的非傳遞,即把操作數(shù)取反后送至目標寄存器。MVN目標寄存器,操作數(shù)目標寄存器操作數(shù)取反79完整版pt3.2指令集介紹數(shù)據(jù)傳送指令應(yīng)用示例:MOV R3,R1,LSL#3;R3=R1×80x55R3R10x010x080x08邏輯左移3位80完整版pt思考與練習(xí)?1.MOV指令與LDR指令都是往目標寄存器中傳送數(shù)據(jù),但是它們有什么區(qū)別嗎?

81完整版pt思考與練習(xí)?1.MOV指令與LDR指令都是往目標寄存器中傳送數(shù)據(jù),但是它們有什么區(qū)別嗎?

MOV指令用于將數(shù)據(jù)從一個寄存器傳送到另一個寄存器中,或者將一個常數(shù)傳送到一個寄存器中,但是不能訪問內(nèi)存。LDR指令用于從內(nèi)存中讀取數(shù)據(jù)放入寄存器中。82完整版pt3.2指令集介紹算術(shù)邏輯運算指令算術(shù)邏輯運算指令包括“加/減”以及“與/或/異或”等指令,它們的格式如下:OpCode結(jié)果寄存器,運算寄存器,第二操作數(shù)運算寄存器第二操作數(shù)運算符結(jié)果寄存器83完整版pt3.2指令集介紹算術(shù)邏輯運算指令OpCode部分算術(shù)運算符:ADD:加法運算ADC:帶進位加法運算SUB:減法運算RSB:逆向減法運算SBC:帶進位減法運算RSC:帶進位逆向減法運算84完整版pt3.2指令集介紹算術(shù)邏輯運算指令OpCode部分邏輯運算符:AND:邏輯“與”運算ORR:邏輯“或”運算EOR:邏輯“異或”運算BIC:位清除運算85完整版pt3.2指令集介紹算術(shù)邏輯運算指令應(yīng)用示例:ADD R3,R1,#0x08;R3=R1+80x000000050x08加法0x??R1第二操作數(shù)R30x0000000D86完整版pt3.2指令集介紹算術(shù)邏輯運算指令應(yīng)用示例:AND R3,R1,#0xFF;R3=R1&0x000000FF0x123456780x000000FF與0x??R1第二操作數(shù)R30x0000007887完整版pt3.2指令集介紹算術(shù)邏輯運算指令應(yīng)用示例:ORR R3,R1,R2;R3=R1|R20x001122330xAA000000或0x??R1R2R30xAA11223388完整版pt0x000000FF0x00000011異或0x??R1R2R30x??操作數(shù)3.2指令集介紹算術(shù)邏輯運算指令應(yīng)用示例:EOR R3,R1,R2,LSL0x03;R3=R1^(R2×8)0x00000077邏輯左移3位0x0000008889完整版pt思考與練習(xí)?1.用R1寄存器的最低字節(jié)替換掉R2寄存器的最低字節(jié),并不影響條件標志位?R1R2BYTE2BYTE3BYTE1BYTE0BYTE2BYTE3BYTE1BYTE0BYTE0BYTE090完整版pt思考與練習(xí)?1.用R1寄存器的最低字節(jié)替換掉R2寄存器的最低字節(jié),并不影響條件標志位? ANDR1,R1,#0x000000FF ANDR2,R2,#0xFFFFFF00 ORRR2,R2,R191完整版pt3.2指令集介紹比較指令比較指令將兩個數(shù)值進行的特定運算,根據(jù)運算結(jié)果影響CPSR的相關(guān)標志位,用于后面程序的條件執(zhí)行,但是運算結(jié)果不予保存。OpCode運算寄存器,操作數(shù)運算寄存器操作數(shù)運算符影響標志位92完整版pt3.2指令集介紹比較指令OpCode比較運算符:CMP:數(shù)值比較CMN:負數(shù)比較TST:位測試TEQ:相等測試93完整版pt0x000000050x08減法條件標志R1R33.2指令集介紹比較指令應(yīng)用示例:CMP R3,R1;R3減R1并影響標志位無符號小于94完整版pt3.2指令集介紹比較指令應(yīng)用示例:TST R3,#0x02;測試R3的第2位并影響標志位0x000000050x02相與條件標志R3操作數(shù)為195完整版pt3.2指令集介紹比較指令應(yīng)用示例:TEQ R3,R2;R3與R2是否相等并影響標志位0x000000AA0x000000CC異或條件標志R3R2不等與CMP的區(qū)別在于TEQ不影響C和V位,也就是只能判斷是否相等,而不能判斷是否大于,或小于。96完整版ptARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令97完整版pt3.2指令集介紹ARM指令集——乘法指令A(yù)RM7TDMI具有三種乘法指令,分別為:32×32位乘法指令;32×32位乘加指令;32×32位結(jié)果為64位的乘/乘加指令。98完整版pt3.2指令集介紹ARM指令集——乘法指令助記符說明操作條件碼位置MULRd,Rm,Rs32位乘法指令RdRm*Rs(Rd≠Rm)MUL{cond}{S}MLARd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn(Rd≠Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi)Rm*RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi)Rm*RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}99完整版pt3.2指令集介紹MUL目標寄存器,運算寄存器,第二操作數(shù)運算寄存器第二操作數(shù)乘法目標寄存器ARM指令集——32×32位乘法指令100完整版pt3.2指令集介紹應(yīng)用示例:MUL R3,R2,R1;R3=R2×R1ARM指令集——32×32位乘法指令0x000000020x00000008乘法0x??R1R2R30x00000010101完整版pt3.2指令集介紹MLA目標寄存器,運算寄存器1,運算寄存器2,第二操作數(shù)ARM指令集——32×32位乘加法指令運算寄存器1運算寄存器2乘法中間結(jié)果加法第二操作數(shù)目標寄存器102完整版pt3.2指令集介紹應(yīng)用示例:MLA R3,R2,R1,R0;R3=R2×R1+R0ARM指令集——32×32位乘加法指令0x000000020x00000008乘法中間結(jié)果加法0x00000005?R2R1R0R30x000000100x00000015103完整版ptARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令104完整版pt3.2指令集介紹ARM指令集——程序如何跳轉(zhuǎn)在ARM中有兩種方式可以實現(xiàn)程序的跳轉(zhuǎn):1.直接向PC寄存器賦值實現(xiàn)跳轉(zhuǎn);

例:MOVPC,R142.使用分支指令直接跳轉(zhuǎn)。105完整版pt3.2指令集介紹ARM指令集——分支指令OpCode跳轉(zhuǎn)目標程序代碼跳轉(zhuǎn)指令跳轉(zhuǎn)目標106完整版pt程序代碼跳轉(zhuǎn)指令跳轉(zhuǎn)目標3.2指令集介紹ARM指令集——分支指令OpCode跳轉(zhuǎn)目標分支指令種類:B:分支指令BL:帶鏈接的分支指令BX:帶狀態(tài)切換的分支指令107完整版pt指令執(zhí)行的條件碼24位常數(shù),跳轉(zhuǎn)目標地址(基于PC的偏移量)操作碼表示區(qū)ARM指令——分支指令B/BL指令編碼格式因為用來表示目標地址的位數(shù)有限,所以B/BL指令無法實現(xiàn)4G(32位)范圍內(nèi)的任意跳轉(zhuǎn)108完整版pt3.2指令集介紹

B指令為簡單的跳轉(zhuǎn)指令,不附帶其它功能。跳轉(zhuǎn)范圍限制在當前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對齊,最低2位地址固定為0)。程序代碼BmainxxmainARM指令集——分支指令“B”109完整版ptBLLabel程序代碼BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPCARM指令——分支指令帶鏈接的分支指令——BL指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)之前將下一條指令的地址拷貝到R14(即LR)鏈接寄存器中,它適用于子程序調(diào)用。跳轉(zhuǎn)范圍限制在當前指令的±32M字節(jié)地址內(nèi)。指令格式如下:Addr1LabelAddr2Addr21.當程序執(zhí)行到BL跳轉(zhuǎn)指令時,硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉(zhuǎn)地址裝入程序計數(shù)器(PC)2.程序跳轉(zhuǎn)到目標地址Label繼續(xù)執(zhí)行,當子程序執(zhí)行結(jié)束后,將LR寄存器內(nèi)容存入PC,返回調(diào)用函數(shù)繼續(xù)執(zhí)行“BL”例如:BLDelayNS ;調(diào)用子程序DelayNS110完整版ptBXRnARM指令——分支指令帶狀態(tài)切換的分支指令——BX指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)的同時切換處理器狀態(tài)。其跳轉(zhuǎn)范圍不受限制。指令格式如下:“BX”最低位為1?YN切換到Thumb狀態(tài)切換到ARM狀態(tài)111完整版ptARM指令——分支指令帶狀態(tài)切換的分支指令——BX指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)的同時切換處理器狀態(tài)。其跳轉(zhuǎn)范圍不受限制。指令格式如下:“BX”BXRn例如:ADRL R0,T_Fun+1

;將Thumb程序的入口地址加1存入R0BX R0

;跳轉(zhuǎn)到R0指定的地址, ;并根據(jù)R0的最低位來切換處理器狀態(tài)112完整版ptARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令113完整版pt3.2指令集介紹ARM指令集——協(xié)處理器指令A(yù)RM內(nèi)核支持協(xié)處理器操作,協(xié)處理器的控制要通過協(xié)處理器命令實現(xiàn)。ARM內(nèi)核與協(xié)處理器的關(guān)系A(chǔ)RM內(nèi)核協(xié)處理器A協(xié)處理器B握手信號數(shù)據(jù)地址總線…114完整版pt助記符說明操作條件碼位置CDPcoproc,opcode1,CRd,CRn,CRm{,opcode2}協(xié)處理器數(shù)據(jù)操作指令取決于協(xié)處理器CDP{cond}LDC{L} coproc,CRd,<地址>協(xié)處理器數(shù)據(jù)讀取指令取決于協(xié)處理器LDC{cond}{L}STC{L}coproc,CRd,<地址>協(xié)處理器數(shù)據(jù)寫入指令取決于協(xié)處理器STC{cond}{L}MCRcoproc,opcode1,Rd,CRn,CRm{,opcode2}ARM寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令取決于協(xié)處理器MCR{cond}MRCcoproc,opcode1,Rd,CRn,CRm{,opcode2}協(xié)處理器寄存器到ARM寄存器到的數(shù)據(jù)傳送指令取決于協(xié)處理器MCR{cond}ARM指令——協(xié)處理器指令115完整版ptARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令116完整版pt在ARM指令集中雜項指令共有3條,它們非常重要,特別是與操作系統(tǒng)的使用息息相關(guān):1.軟件中斷產(chǎn)生指令:SWI2.程序狀態(tài)寄存器讀指令:MRS3.程序狀態(tài)寄存器寫指令:MSR3.2指令集介紹ARM指令集——雜項指令117完整版pt3.2指令集介紹ARM指令集——軟中斷指令SWI指令用于產(chǎn)生軟中斷,主要用于用戶程序調(diào)用操作系統(tǒng)的系統(tǒng)服務(wù)。執(zhí)行該指令后,處理器將完成以下動作:1.切換到管理模式2.將CPSR備份到管理模式下的SPSR寄存器3.程序跳轉(zhuǎn)到軟件中斷入口“SWI”118完整版pt用戶模式……管理模式……任務(wù)1任務(wù)2其它代碼功能1:打開中斷功能2:關(guān)閉中斷功能n:任務(wù)調(diào)度CPSR寄存器SPSR寄存器1.使用操作系統(tǒng)后,為了防止出錯的任務(wù)影響其它任務(wù)的執(zhí)行,通常將任務(wù)放在用戶模式執(zhí)行,以限制其權(quán)限;2.對于一些重要的操作,如中斷的開關(guān),必須由操作系統(tǒng)完成。使用軟件中斷指令即可完成系統(tǒng)功能調(diào)用;ARM雜項指令——軟中斷指令119完整版pt3.2指令集介紹ARM指令集——軟中斷指令SWI指令格式如下所示:“SWI”SWIimmed_24可以利用指令中的這個24位立即數(shù)向軟中斷服務(wù)程序傳遞參數(shù),比如請求的服務(wù)類型120完整版ptARM雜項指令——軟中斷指令根據(jù)SWI指令傳遞的參數(shù)SWI異常處理程序可以作出相應(yīng)的處理。SWI指令傳遞參數(shù)有以下兩種方法,指令中的24位立即數(shù)指定了用戶請求的服務(wù)類型,參數(shù)通過通用寄存器傳遞。MOVR0,#34

;設(shè)置子功能號為34SWI12

;調(diào)用12號軟中斷指令中的24位立即數(shù)被忽略,用戶請求的服務(wù)類型由寄存器R0的值決定,參數(shù)通過其它的通用寄存器傳遞。MOVR0,#12

;調(diào)用12號軟中斷MOVR1,#34

;設(shè)置子功能號為34SWI0

121完整版ptARM雜項指令——軟中斷指令在SWI異常中斷處理程序中,取出SWI指令中立即數(shù)的步驟為:首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可通過對SPSR訪問得到;然后取得該SWI指令的地址,這可通過訪問LR寄存器得到;接著讀出該SWI指令,分解出立即數(shù)。SWI_HandlerSTMFDSP!,{R0-R3,R12,LR} ;現(xiàn)場保護MRSR0,SPSR ;讀取SPSRSTMFDSP!,{R0} ;保存SPSRTSTR0,#0x20 ;測試T標志位LDRNEHR0,[LR,#-2] ;若是Thumb指令,讀取指令碼(16位)BICNER0,R0,#0xFF00 ;取得Thumb指令的8位立即數(shù)LDREQR0,[LR,#-4] ;若是ARM指令,讀取指令碼(32位)BICEQR0,R0,#0xFF000000 ;取得ARM指令的24位立即數(shù) ...LDMFDSP!,{R0-R3,R12,PC}^ ;SWI異常中斷返回122完整版pt3.2指令集介紹ARM指令集——狀態(tài)寄存器讀指令在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進行讀操作。通過讀CPSR可以了解當前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。指令格式如下所示:“MRS”MRS目標寄存器,psr目標寄存器PSR123完整版pt3.2指令集介紹ARM指令集——狀態(tài)寄存器讀指令應(yīng)用示例:

MRSR1,CPSR ;讀取CPSR狀態(tài)寄存器到R1

MRSR2,SPSR ;讀取SPSR狀態(tài)寄存器到R2“MRS”124完整版ptARM雜項指令——狀態(tài)寄存器寫指令在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式等操作?!癕SR”MSRpsr_field,操作數(shù)操作數(shù)分為兩種:1.寄存器2.8位圖立即數(shù)PSR寄存器被分為四個8位的域:1.狀態(tài)位域:用s表示2.擴展位域:用x表示3.條件標志位域:用f表示4.控制位域:用c表示125完整版pt3.2指令集介紹ARM指令集——狀態(tài)寄存器寫指令示例,將R0的內(nèi)容寫入CPSR寄存器的控制位域MSRCPSR_c,R0“MSR”條件代碼標志保留控制位域Byte0Byte3,Byte2,Byte1R0CPSRNZCV——IM0M1M2M3M4TF—...313029282726876543210Byte0126完整版ptARM雜項指令——狀態(tài)寄存器寫指令“MSR”啟動代碼堆棧初始化應(yīng)用示例:INITSTACK MOVR0,LR;設(shè)置管理模式堆棧

MSRCPSR_C,#0xD3 LDRSP,StackSvc;設(shè)置中斷模式堆棧

MSRCPSR_C,#0xD2 LDRSP,StackIrq ......模式位狀態(tài)位IRQ禁止位FIQ禁止位NZCVIFTM4M3M2M1M031302928272676543210配置值0xD311010011禁止FIQ中斷禁止IRQ中斷ARM狀態(tài)管理模式

MSRCPSR_C,#0xD3CPRS寄存器127完整版ptARM雜項指令——狀態(tài)寄存器寫指令“MSR”啟動代碼堆棧初始化應(yīng)用示例:INITSTACK MOVR0,LR;設(shè)置管理模式堆棧

MSRCPSR_C,#0xD3 LDRSP,StackSvc;設(shè)置中斷模式堆棧

MSRCPSR_C,#0xD2 LDRSP,StackIrq ......模式位狀態(tài)位IRQ禁止位FIQ禁止位NZCVIFTM4M3M2M1M031302928272676543210配置值0xD211010010禁止FIQ中斷禁止IRQ中斷ARM狀態(tài)IRQ模式

MSRCPSR_C,#0xD2CPRS寄存器128完整版pt思考與練習(xí)?1.

使用MSR和MRS指令,通過修改CPSR寄存器,實現(xiàn)打開/關(guān)閉IRQ中斷的兩個子程序,注意不能影響其它位?129完整版pt(1)(2)(3)(4);子程序:使能IRQ中斷Enable_IRQ

MRSR0,CPSRBICR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR;子程序:禁能IRQ中斷Disable_IRQ

MRSR0CPSRORRR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR1.將CPSR寄存器內(nèi)容讀出到R0;2.修改對應(yīng)于CPSR中的I控制位;3.將修改后的值寫回CPSR寄存器的對應(yīng)控制域;4.返回上一層函數(shù);思考與練習(xí)?130完整版ptARM指令種類1.存儲器訪問指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項指令7.偽指令131完整版pt3.2指令集介紹ARM偽指令A(yù)RM偽指令不屬于ARM指令集中的指令,是為了編程方便而定義的。偽指令可以像其它ARM指令一樣使用,但在編譯時這些指令將被等效的ARM指令代替。反匯編代碼源程序偽指令實際指令編譯器實際指令實際指令132完整版pt3.2指令集介紹ARM偽指令A(yù)RM偽指令有四條:1.小范圍地址讀取指令:ADR2.中等范圍地址讀取指令:ADRL3.大等范圍地址讀取指令:LDR4.空操作指令:NOP133完整版ptARM偽指令——小范圍的地址讀取

ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令,若不能用一條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。ADR目標寄存器,表達式目標寄存器表達式134完整版ptARM偽指令——小范圍的地址讀取ADR目標寄存器,表達式目標寄存器表達式地址表達式expr的取指范圍:當?shù)刂分挡皇亲謱R時,其取指范圍為±255;當?shù)刂分凳亲謱R時,其取指范圍為±1020;當?shù)刂分凳?6字節(jié)對齊時,其取指范圍將更大。135完整版ptARM偽指令——小范圍的地址讀取...ADRR0,Delay...DelayMOVR0,r14...應(yīng)用示例(源程序):使用偽指令將程序標號Delay的地址存入R0

...0x20ADDr0,pc,#0x3c......0x64MOVr0,r14...編譯后的反匯編代碼:地址程序代碼136完整版ptARM偽指令——小范圍的地址讀取...ADRR0,Delay...DelayMOVR0,r14...應(yīng)用示例(源程序):使用偽指令將程序標號Delay的地址存入R0

...0x20ADDr0,pc,#0x3c......0x64MOVr0,r14...編譯后的反匯編代碼:ADR偽指令被匯編成一條指令137完整版ptARM偽指令——小范圍的地址讀取;查表應(yīng)用示例:

ADRR0,DISP_TAB

;加載轉(zhuǎn)換表地址LDRBR1,[R0,R2] ;使用R2作為參數(shù),進行查表…DISP_TABDCB0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8138完整版ptARM偽指令——中等范圍的地址讀取

ADRL偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中,比ADR偽指令可以讀取更大范圍的地址。在匯編編譯器編譯源程序時,ADRL偽指令被編譯器替換成兩條合適的指令。若不能用兩條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。ADRL

標寄存器,表達式目標寄存器表達式139完整版ptARM偽指令——中等范圍的地址讀取地址表達式expr的取指范圍:當?shù)刂分挡皇亲謱R時,其取指范圍為±64K當?shù)刂分凳亲謱R時,其取指范圍為±256K當?shù)刂分凳?6字節(jié)對齊時,其取指范圍將更大ADRL

標寄存器,表達式目標寄存器表達式140完整版ptARM偽指令——中等范圍的地址讀取...ADRLR0,Delay...DelayMOVR0,r14...應(yīng)用示例(源程序):使用偽指令將程序標號Delay的地址存入R0...0x20ADDr0,pc,#400x24

溫馨提示

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

最新文檔

評論

0/150

提交評論