![嵌入式系統(tǒng)PPT電子課件教案-第3章_ARM7TDMI(-S)指令系統(tǒng).ppt_第1頁](http://file.renrendoc.com/FileRoot1/2019-1/27/3b49cfae-7bf3-4770-ac52-f110408d39ee/3b49cfae-7bf3-4770-ac52-f110408d39ee1.gif)
![嵌入式系統(tǒng)PPT電子課件教案-第3章_ARM7TDMI(-S)指令系統(tǒng).ppt_第2頁](http://file.renrendoc.com/FileRoot1/2019-1/27/3b49cfae-7bf3-4770-ac52-f110408d39ee/3b49cfae-7bf3-4770-ac52-f110408d39ee2.gif)
![嵌入式系統(tǒng)PPT電子課件教案-第3章_ARM7TDMI(-S)指令系統(tǒng).ppt_第3頁](http://file.renrendoc.com/FileRoot1/2019-1/27/3b49cfae-7bf3-4770-ac52-f110408d39ee/3b49cfae-7bf3-4770-ac52-f110408d39ee3.gif)
![嵌入式系統(tǒng)PPT電子課件教案-第3章_ARM7TDMI(-S)指令系統(tǒng).ppt_第4頁](http://file.renrendoc.com/FileRoot1/2019-1/27/3b49cfae-7bf3-4770-ac52-f110408d39ee/3b49cfae-7bf3-4770-ac52-f110408d39ee4.gif)
![嵌入式系統(tǒng)PPT電子課件教案-第3章_ARM7TDMI(-S)指令系統(tǒng).ppt_第5頁](http://file.renrendoc.com/FileRoot1/2019-1/27/3b49cfae-7bf3-4770-ac52-f110408d39ee/3b49cfae-7bf3-4770-ac52-f110408d39ee5.gif)
已閱讀5頁,還剩152頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第3章 arm7tdmi(-s)指令系統(tǒng),1.arm程序的文件類型: c程序:arm開發(fā)中大部分程序使用c語言編寫,文件類型為“*.c”; 匯編程序:涉及到硬件底層操作的代碼有時必須使用匯編語言編寫,文件類型為“*.s”。 2.為什么學習arm指令系統(tǒng): 操作系統(tǒng)移植 編寫啟動代碼 方便程序調(diào)試,前言,1. arm處理器的尋址方式; 2. arm指令的特點; 3. arm指令的種類,它能完成哪些功能。,本章學習重點,目錄,1.arm處理器尋址方式 2.指令集介紹 arm指令集 thumb指令集,目錄,1.arm處理器尋址方式 2.指令集介紹 arm指令集 thumb指令集,第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)切換開銷幾乎為零。,第3章 arm7tdmi(-s)指令系統(tǒng),arm指令集與thumb指令集的關(guān)系,thumb指令集具有靈活、小巧的特點,arm指令集支持arm核所有的特性,具有高效、快速的特點,3.1 arm處理器尋址方式,尋址方式分類,尋址方式是根據(jù)指令中給出的地址碼字段來實現(xiàn)尋找真實操作數(shù)地址的方式。arm處理器具有8種基本尋址方式。 1.寄存器尋址; 2.立即尋址; 3.寄存器移位尋址; 4.寄存器間接尋址; 5.基址尋址; 6.多寄存器尋址; 7.堆棧尋址; 8.相對尋址。,操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執(zhí)行時直接取出寄存器值來操作。寄存器尋址指令舉例如下: mov r1,r2 ;將r2的值存入r1 sub r0,r1,r2 ;將r1的值減去r2的值,結(jié)果保存到r0,3.1 arm處理器尋址方式,尋址方式分類寄存器尋址,mov r1,r2,0xaa,立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(shù)本身,也就是說,數(shù)據(jù)就包含在指令當中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱為立即數(shù))。立即尋址指令舉例如下: subs r0,r0,#1 ;r0減1,結(jié)果放入r0,并且影響標志位 mov r0,#0xff000 ;將立即數(shù)0xff000裝入r0寄存器,3.1 arm處理器尋址方式,尋址方式分類立即尋址,mov r0,#0xff00,0xff00,從代碼中獲得數(shù)據(jù),寄存器移位尋址是arm指令集特有的尋址方式。當?shù)?個操作數(shù)是寄存器移位方式時,第2個寄存器操作數(shù)在與第1個操作數(shù)結(jié)合之前,選擇進行移位操作。寄存器移位尋址指令舉例如下: mov r0,r2,lsl #3 ;r2的值左移3位,結(jié)果放入r0, ;即是r0=r28 ands r1,r1,r2,lsl r3 ;r2的值左移r3位,然后和r1相 ;“與”操作,結(jié)果放入r1,3.1 arm處理器尋址方式,尋址方式分類寄存器移位尋址,mov r0,r2,lsl #3,0x08,0x08,邏輯左移3位,寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數(shù)保存在寄存器指定地址的存儲單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下: ldr r1,r2 ;將r2指向的存儲單元的數(shù)據(jù)讀出 ;保存在r1中 swp r1,r1,r2 ;將寄存器r1的值和r2指定的存儲 ;單元的內(nèi)容交換,3.1 arm處理器尋址方式,尋址方式分類寄存器間接尋址,ldr r0,r2,0xaa,基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址?;穼ぶ酚糜谠L問基址附近的存儲單元,常用于查表、數(shù)組操作、功能部件寄存器訪問等?;穼ぶ分噶钆e例如下: ldr r2,r3,#0x0c ;讀取r3+0x0c地址上的存儲單元 ;的內(nèi)容,放入r2 str r1,r0,#-4! ;先r0=r0-4,然后把r1的值寄存 ;到保存到r0指定的存儲單元,3.1 arm處理器尋址方式,尋址方式分類基址尋址,ldr r2,r3,#0x0c,0xaa,將r3+0x0c作為地址裝載數(shù)據(jù),多寄存器尋址一次可傳送幾個寄存器值,允許一條指令傳送16個寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下: ldmia r1!,r2-r7,r12 ;將r1指向的單元中的數(shù)據(jù)讀出到 ;r2r7、r12中(r1自動加1) stmia r0!,r2-r7,r12 ;將寄存器r2r7、r12的值保 ;存到r0指向的存儲; 單元中 ;(r0自動加1),3.1 arm處理器尋址方式,尋址方式分類多寄存器尋址,ldmia r1!,r2-r4,r6,0x40000010,堆棧是一個按特定順序進行存取的存儲區(qū),操作順序為“后進先出” 。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區(qū)域(堆棧),指針所指向的存儲單元即是堆棧的棧頂。存儲器堆??煞譃閮煞N: 向上生長:向高地址方向生長,稱為遞增堆棧 向下生長:向低地址方向生長,稱為遞減堆棧,3.1 arm處理器尋址方式,尋址方式分類堆棧尋址,3.1 arm處理器尋址方式,尋址方式分類堆棧尋址,0x12345678,0x12345678,堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項,稱為滿堆棧;堆棧指針指向下一個待壓入數(shù)據(jù)的空位置,稱為空堆棧。,3.1 arm處理器尋址方式,尋址方式分類堆棧尋址,0x12345678,所以可以組合出四種類型的堆棧方式: 滿遞增:堆棧向上增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最高地址。指令如ldmfa、stmfa等; 空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如ldmea、stmea等; 滿遞減:堆棧向下增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最低地址。指令如ldmfd、stmfd等; 空遞減:堆棧向下增長,堆棧指針向堆棧下的第一個空位置。指令如ldmed、stmed等。,3.1 arm處理器尋址方式,尋址方式分類堆棧尋址,相對尋址是基址尋址的一種變通。由程序計數(shù)器pc提供基準地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對尋址指令舉例如下: bl subr1 ;調(diào)用到subr1子程序 beq loop ;條件跳轉(zhuǎn)到loop標號處 . loop mov r6,#1 . subr1 .,3.1 arm處理器尋址方式,尋址方式分類相對尋址,1. arm處理器的尋址方式 8種尋址方式; 2. arm指令的特點; 3. arm指令的種類,它能完成哪些功能。,本章學習重點,目錄,1.arm處理器尋址方式 2.指令集介紹 arm指令集 thumb指令集,簡單的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,#10 loop bl add_sub ;調(diào)用子程序add_sub b loop ;跳轉(zhuǎn)到loop add_sub adds r0,r0,r1 ;r0 = r0 + r1 mov pc,lr ;子程序返回 end ;文件結(jié)束,使用“;”進行注釋,標號頂格寫,實際代碼段,聲明文件結(jié)束,;文件名:test1.s ;功能:實現(xiàn)兩個寄存器相加 ;說明:使用armulate軟件仿真調(diào)試 area example1,code,readonly ;聲明代碼段example1 entry ;標識程序入口 code32 ;聲明32位arm指令 start mov r0,#0 ;設(shè)置參數(shù) mov r1,#10 loop bl add_sub ;調(diào)用子程序add_sub b loop ;跳轉(zhuǎn)到loop add_sub adds r0,r0,r1 ;r0 = r0 + r1 mov pc,lr ;子程序返回 end ;文件結(jié)束,簡單的arm程序,目錄,1.arm處理器尋址方式 2.指令集介紹 arm指令集 thumb指令集,arm指令小節(jié)目錄,1.指令格式 2.條件碼 3.arm指令,arm指令小節(jié)目錄,1.指令格式 2.條件碼 3.arm指令,arm指令的基本格式如下:,3.2 指令集介紹,arm指令集指令格式, s ,其中號內(nèi)的項是必須的,號內(nèi)的項是可選的。各項的說明如下:,opcode:指令助記符; cond:執(zhí)行條件; s:是否影響cpsr寄存器的值; rd:目標寄存器; rn:第1個操作數(shù)的寄存器; operand2:第2個操作數(shù);,arm指令的基本格式如下:,3.2 指令集介紹,arm指令集第2個操作數(shù), s ,靈活的使用第2個操作數(shù)“operand2”能夠提高代碼效率。它有如下的形式: #immed_8r常數(shù)表達式; rm寄存器方式; rm,shift寄存器移位方式;,3.2 指令集介紹,arm指令集第2個操作數(shù),#immed_8r常數(shù)表達式 該常數(shù)必須對應(yīng)8位位圖,即必須是一個8位的常數(shù)通過循環(huán)右移偶數(shù)位可以得到的數(shù)。,循環(huán)右移10位,移位前的8位常數(shù)0x12,移位后得到的常數(shù)0x04800000,3.2 指令集介紹,arm指令集第2個操作數(shù),#immed_8r常數(shù)表達式 該常數(shù)必須對應(yīng)8位位圖,即必須是一個8位的常數(shù)通過循環(huán)右移偶數(shù)位可以得到的數(shù)。,例如: mov r0,#1 and r1,r2,#0x0f mov r1,#0xc000 ;0xc000可由0x03循環(huán)右移16位得到,2.請列舉2個8位圖立即數(shù)?,思考與練習,?,1.以下8位圖立即數(shù)是否合法? 0x0103c000 0x12800000,0x4000003b(0xed循環(huán)右移2位) 0x0016c000(0x5b循環(huán)右移18位),3.2 指令集介紹,arm指令集第2個操作數(shù),rm寄存器方式 在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。 例如: sub r1,r1,r2 mov pc,r0,3.2 指令集介紹,arm指令集第2個操作數(shù),rm,shift寄存器移位方式 將寄存器的移位結(jié)果作為操作數(shù),但rm值保持不變,移位方法如下:,3.2 指令集介紹,arm指令集第2個操作數(shù),3.2 指令集介紹,arm指令集第2個操作數(shù),rm,shift寄存器移位方式 例如: add r1,r1,r1,lsl #3 ;r1=r1+r1*8=9r1 sub r1,r1,r2,lsr r3 ;r1=r1-(r2/2r3),arm指令小節(jié)目錄,1.指令格式 2.條件碼 3.arm指令,arm指令的基本格式如下:,3.2 指令集介紹,arm指令集條件碼, s ,使用條件碼“cond”可以實現(xiàn)高效的邏輯操作,提高代碼效率。 絕大部分的arm指令都可以條件執(zhí)行,而thumb指令只有b(跳轉(zhuǎn))指令具有條件執(zhí)行 功能。如果指令不標明條件代碼,將默認為無條件(al)執(zhí)行。,指令條件碼表,3.2 指令集介紹,arm指令集條件碼,c代碼: if(a b) a+; else b+;,對應(yīng)的匯編代碼: cmp r0,r1 ;r0與r1比較 addhi r0,r0,#1;若r0r1,則r0=r0+1 addls r1,r1,#1;若r0r1,則r1=r1+1,示例:,1. arm處理器的尋址方式 8種尋址方式; 2. arm指令的特點 可條件執(zhí)行、可選擇影響標志位、具有非常靈活的第二操作數(shù); 3. arm指令的種類,它能完成哪些功能。,本章學習重點,arm指令種類,1.存儲器訪問指令 2.數(shù)據(jù)處理指令 3.乘法指令 4.arm分支指令 5.協(xié)處理器指令 6.雜項指令 7.偽指令,為什么要掌握部分常用arm指令? 熟悉arm體系結(jié)構(gòu):通過指令的學習可以更深入的了解arm硬件結(jié)構(gòu)的特點; 修改啟動代碼:啟動代碼為了滿足大部分系統(tǒng)的順利運行,通常將系統(tǒng)硬件配置在最低性能,通過調(diào)整啟動代碼中的參數(shù)使其更適合自己的硬件系統(tǒng); 調(diào)試程序:通過觀察反匯編代碼了解程序執(zhí)行情況,比如某個變量的操作是否被編譯器優(yōu)化掉了。 閱讀已有的匯編代碼;,arm指令種類,1.存儲器訪問指令 2.數(shù)據(jù)處理指令 3.乘法指令 4.arm分支指令 5.協(xié)處理器指令 6.雜項指令 7.偽指令,3.2 指令集介紹,arm指令集存儲器訪問指令,arm處理器是典型的risc處理器,對存儲器的訪問只能使用加載和存儲指令實現(xiàn)。arm處理器是馮諾依曼存儲結(jié)構(gòu),程序空間、ram空間及i/o映射空間統(tǒng)一編址,除對ram操作以外,對外圍io、程序數(shù)據(jù)的訪問均要通過加載/存儲指令進行。 存儲器訪問指令分為單寄存器操作指令和多寄存器操作指令。,ldr/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存儲器訪問指令單寄存器存取,3.2 指令集介紹,arm存儲器訪問指令單寄存器存取,3.2 指令集介紹,arm存儲器訪問指令單寄存器存取,裝載指令:ldr,存儲指令:str,ldr/str指令搭配不同的后綴實現(xiàn)不同方式的單寄存器存取操作:,arm存儲器訪問指令裝載指令,arm存儲器訪問指令保存指令,arm存儲器訪問指令地址形式,arm存儲器訪問指令尋址方式,注意:大多數(shù)情況下,必須保證字數(shù)據(jù)操作的地址是32位對齊的。,應(yīng)用示例: ldr r2,r5 ;將r5指向地址的字數(shù)據(jù)存入r2,0x12345678,arm存儲器訪問指令單寄存器轉(zhuǎn)載應(yīng)用,應(yīng)用示例: str r1,r2,#0x04 ;將r1的數(shù)據(jù)存儲到r0+0x04地址,0x12345678,+4,arm存儲器訪問指令單寄存器保存應(yīng)用,3.2 指令集介紹,arm存儲器訪問指令多寄存器存取,多寄存器加載/存儲指令可以實現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。ldm為加載多個寄存器;stm為存儲多個寄存器。允許一條指令傳送16個寄存器的任何子集或所有寄存器。它們主要用于現(xiàn)場保護、數(shù)據(jù)復制、常數(shù)傳遞等。,3.2 指令集介紹,arm存儲器訪問指令多寄存器存取,3.2 指令集介紹,arm存儲器訪問指令多寄存器存取,裝載指令:ldm,存儲指令:stm,ldm/stm指令搭配不同的后綴實現(xiàn)不同方式地址增長方式:,arm存儲器訪問指令多寄存器存取,數(shù)據(jù)塊傳送指令操作過程如右圖所示,其中r1為指令執(zhí)行前的基址寄存器,r1則為指令執(zhí)行后的基址寄存器。,3.2 指令集介紹,arm存儲器訪問指令多寄存器存取,多寄存器存取指令與堆棧操作指令的關(guān)系如下表所示。,3.2 指令集介紹,arm存儲器訪問指令多寄存器存取,多寄存器存取指令與堆棧操作指令的關(guān)系如下表所示。,0x40000000,r1,r2,0x?,0x01,0x40000000,0x?,r3,r4,0x?,r6,0x?,0x02,0x03,0x04,0x40000004,0x40000008,0x4000000c,存儲器,0x40000010,應(yīng)用示例: ldmia r1!,r2-r4,r6 將r1指向的內(nèi)存數(shù)據(jù)讀取到r0-r4和r6寄存器中,arm存儲器訪問指令多寄存器存取,應(yīng)用示例: stmfd sp!,r0-r7,lr,arm存儲器訪問指令滿遞減壓棧操作,棧 頂,1.壓棧操作前寄存器和堆棧區(qū)的狀態(tài);,2.壓棧操作前堆棧指針指向棧頂;,應(yīng)用示例: stmfd sp!,r0-r7,lr,arm存儲器訪問指令滿遞減壓棧操作,1.壓棧操作前寄存器和堆棧區(qū)的狀態(tài);,2.壓棧操作前堆棧指針指向棧頂;,3.執(zhí)行壓棧操作指令保存r0-r7和lr,0x0123,0x3ffc,棧 頂,應(yīng)用示例: ldmfd sp!,r0-r7,pc,arm存儲器訪問指令滿遞減出棧操作,1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);,2.出棧操作前堆棧指針指向棧頂;,棧 頂,應(yīng)用示例: ldmfd sp!,r0-r7,pc,arm存儲器訪問指令滿遞減出棧操作,1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);,2.出棧操作前堆棧指針指向棧頂;,棧 頂,3.執(zhí)行出棧操作指令恢復r0-r7和pc,0x4020,帶狀態(tài)寄存器恢復的出棧操作: ldmfd sp!,r0-r7,pc,arm存儲器訪問指令滿遞減出棧操作,1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);,2.出棧操作前堆棧指針指向棧頂;,棧 頂,棧 頂,帶狀態(tài)寄存器恢復的出棧操作: ldmfd sp!,r0-r7,pc,arm存儲器訪問指令滿遞減出棧操作,1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);,2.出棧操作前堆棧指針指向棧頂;,0x4020,3.執(zhí)行出棧操作指令恢復r0-r7和pc,3.2 指令集介紹,swp指令用于將一個內(nèi)存單元(該單元地址放在寄存器rn中)的內(nèi)容讀取到一個寄存器rd中,同時將另一個寄存器rm的內(nèi)容寫入到該內(nèi)存單元中。使用swp可實現(xiàn)信號量操作。,arm存儲器訪問指令寄存器和存儲器交換指令,3.2 指令集介紹,arm存儲器訪問指令寄存器和存儲器交換指令,3.2 指令集介紹,arm存儲器訪問指令寄存器和存儲器交換指令,裝載指令: swp 讀入寄存器,輸出寄存器,目標地址,3.2 指令集介紹,arm存儲器訪問指令寄存器和存儲器交換指令,應(yīng)用示例: swp r2,r1,r0 將r1的內(nèi)容與r0指向的存儲單元的內(nèi)容進行交換,0x12345678,0x11223344,arm指令種類,1.存儲器訪問指令 2.數(shù)據(jù)處理指令 3.乘法指令 4.arm分支指令 5.協(xié)處理器指令 6.雜項指令 7.偽指令,3.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)標志。,3.2 指令集介紹,數(shù)據(jù)傳送指令,mov指令將8位圖立即數(shù)或寄存器傳送到目標寄存器(rd),可用于移位運算等操作。,3.2 指令集介紹,數(shù)據(jù)傳送指令,mov指令將8位圖立即數(shù)或寄存器傳送到目標寄存器(rd),可用于移位運算等操作。,同類型的指令還有mvn,它可以實現(xiàn)數(shù)據(jù)的非傳遞,即把操作數(shù)取反后送至目標寄存器。,3.2 指令集介紹,數(shù)據(jù)傳送指令,應(yīng)用示例: mov r3,r1,lsl #3 ;r3=r18,0x08,0x08,邏輯左移3位,思考與練習,?,1.mov指令與ldr指令都是往目標寄存器中傳送數(shù)據(jù),但是它們有什么區(qū)別嗎?,思考與練習,?,1.mov指令與ldr指令都是往目標寄存器中傳送數(shù)據(jù),但是它們有什么區(qū)別嗎? mov指令用于將數(shù)據(jù)從一個寄存器傳送到另一個寄存器中,或者將一個常數(shù)傳送到一個寄存器中,但是不能訪問內(nèi)存。ldr指令用于從內(nèi)存中讀取數(shù)據(jù)放入寄存器中。,3.2 指令集介紹,算術(shù)邏輯運算指令,算術(shù)邏輯運算指令包括“加/減”以及“與/或/異或”等指令,它們的格式如下:,3.2 指令集介紹,算術(shù)邏輯運算指令,opcode,3.2 指令集介紹,算術(shù)邏輯運算指令,opcode,3.2 指令集介紹,算術(shù)邏輯運算指令,應(yīng)用示例: add r3,r1, #0x08 ;r3=r1+8,0x0000000d,3.2 指令集介紹,算術(shù)邏輯運算指令,應(yīng)用示例: and r3,r1, #0xff ;r3=r1 & 0x000000ff,0x00000078,3.2 指令集介紹,算術(shù)邏輯運算指令,應(yīng)用示例: orr r3,r1, r2 ;r3=r1|r2,0xaa112233,3.2 指令集介紹,算術(shù)邏輯運算指令,應(yīng)用示例: eor r3,r1, r2,lsl 0x03 ;r3=r1 (r2 8),0x00000077,邏輯左移3位,0x00000088,思考與練習,?,1.用r1寄存器的最低字節(jié)替換掉r2寄存器的最低字節(jié),并不影響條件標志位?,byte0,byte0,思考與練習,?,1.用r1寄存器的最低字節(jié)替換掉r2寄存器的最低字節(jié),并不影響條件標志位? and r1,r1,#0x000000ff and r2,r2,#0xffffff00 orr r2,r2,r1,3.2 指令集介紹,比較指令,比較指令將兩個數(shù)值進行的特定運算,根據(jù)運算結(jié)果影響cpsr的相關(guān)標志位,用于后面程序的條件執(zhí)行,但是運算結(jié)果不予保存。,3.2 指令集介紹,比較指令,opcode,3.2 指令集介紹,比較指令,應(yīng)用示例: cmp r3,r1 ;r3減r1并影響標志位,無符號小于,3.2 指令集介紹,比較指令,應(yīng)用示例: tst r3,#0x02 ;測試r3的第2位并影響標志位,為1,3.2 指令集介紹,比較指令,應(yīng)用示例: teq r3,r2 ; r3與r2是否相等并影響標志位,不等,與cmp的區(qū)別在于teq不影響c和v位,也就是只能判斷是否相等,而不能判斷是否大于,或小于。,arm指令種類,1.存儲器訪問指令 2.數(shù)據(jù)處理指令 3.乘法指令 4.arm分支指令 5.協(xié)處理器指令 6.雜項指令 7.偽指令,3.2 指令集介紹,arm指令集乘法指令,arm7tdmi具有三種乘法指令,分別為: 3232位乘法指令; 32 32位乘加指令; 32 32位結(jié)果為64位的乘/乘加指令。,3.2 指令集介紹,arm指令集乘法指令,3.2 指令集介紹,arm指令集3232位乘法指令,3.2 指令集介紹,應(yīng)用示例: mul r3,r2,r1 ; r3=r2r1,arm指令集3232位乘法指令,0x00000010,3.2 指令集介紹,arm指令集3232位乘加法指令,3.2 指令集介紹,應(yīng)用示例: mla r3,r2,r1,r0 ; r3=r2r1 + r0,arm指令集3232位乘加法指令,0x00000010,0x00000015,arm指令種類,1.存儲器訪問指令 2.數(shù)據(jù)處理指令 3.乘法指令 4.arm分支指令 5.協(xié)處理器指令 6.雜項指令 7.偽指令,3.2 指令集介紹,arm指令集程序如何跳轉(zhuǎn),在arm中有兩種方式可以實現(xiàn)程序的跳轉(zhuǎn): 1.直接向pc寄存器賦值實現(xiàn)跳轉(zhuǎn); 例: mov pc,r14 2.使用分支指令直接跳轉(zhuǎn)。,3.2 指令集介紹,arm指令集,分支指令,3.2 指令集介紹,arm指令集,分支指令,opcode 跳轉(zhuǎn)目標,arm指令分支指令,b/bl指令編碼格式,因為用來表示目標地址的位數(shù)有限,所以b/bl指令無法實現(xiàn)4g(32位)范圍內(nèi)的任意跳轉(zhuǎn),3.2 指令集介紹,b指令為簡單的跳轉(zhuǎn)指令,不附帶其它功能。跳轉(zhuǎn)范圍限制在當前指令的32m字節(jié)地址內(nèi)(arm指令為字對齊,最低2位地址固定為0)。,arm指令集,分支指令,“b”,arm指令分支指令,帶鏈接的分支指令bl指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)之前將下一條指令的地址拷貝到r14(即lr) 鏈接寄存器中,它適用于子程序調(diào)用。跳轉(zhuǎn)范圍限制在當前指令的32m字節(jié)地址內(nèi)。指令格式如下:,addr1,addr2,1.當程序執(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”,例如: bl delayns ;調(diào)用子程序delayns,arm指令分支指令,帶狀態(tài)切換的分支指令bx指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)的同時切換處理器狀態(tài)。其跳轉(zhuǎn)范圍不受限制。指令格式如下:,“bx”,arm指令分支指令,帶狀態(tài)切換的分支指令bx指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)的同時切換處理器狀態(tài)。其跳轉(zhuǎn)范圍不受限制。指令格式如下:,“bx”,例如: adrl r0,t_fun+1 ;將thumb程序的入口地址加1存入r0 bx r0 ; 跳轉(zhuǎn)到r0指定的地址, ;并根據(jù)r0的最低位來切換處理器狀態(tài),arm指令種類,1.存儲器訪問指令 2.數(shù)據(jù)處理指令 3.乘法指令 4.arm分支指令 5.協(xié)處理器指令 6.雜項指令 7.偽指令,3.2 指令集介紹,arm指令集協(xié)處理器指令,arm內(nèi)核支持協(xié)處理器操作,協(xié)處理器的控制要通過協(xié)處理器命令實現(xiàn)。,arm內(nèi)核與協(xié)處理器的關(guān)系,arm指令協(xié)處理器指令,arm指令種類,1.存儲器訪問指令 2.數(shù)據(jù)處理指令 3.乘法指令 4.arm分支指令 5.協(xié)處理器指令 6.雜項指令 7.偽指令,在arm指令集中雜項指令共有3條,它們非常重要,特別是與操作系統(tǒng)的使用息息相關(guān): 1.軟件中斷產(chǎn)生指令:swi 2. 程序狀態(tài)寄存器讀指令:mrs 3. 程序狀態(tài)寄存器寫指令:msr,3.2 指令集介紹,arm指令集雜項指令,3.2 指令集介紹,arm指令集軟中斷指令,swi指令用于產(chǎn)生軟中斷,主要用于用戶程序調(diào)用操作系統(tǒng)的系統(tǒng)服務(wù)。執(zhí)行該指令后,處理器將完成以下動作: 1. 切換到管理模式 2. 將cpsr備份到管理模式下的spsr寄存器 3. 程序跳轉(zhuǎn)到軟件中斷入口,“swi”,1.使用操作系統(tǒng)后,為了防止出錯的任務(wù)影響其它任務(wù)的執(zhí)行,通常將任務(wù)放在用戶模式執(zhí)行,以限制其權(quán)限;,2.對于一些重要的操作,如中斷的開關(guān),必須由操作系統(tǒng)完成。使用軟件中斷指令即可完成系統(tǒng)功能調(diào)用;,arm雜項指令軟中斷指令,3.2 指令集介紹,arm指令集軟中斷指令,swi指令格式如下所示:,“swi”,arm雜項指令軟中斷指令,根據(jù)swi指令傳遞的參數(shù)swi異常處理程序可以作出相應(yīng)的處理。swi指令傳遞參數(shù)有以下兩種方法, 指令中的24位立即數(shù)指定了用戶請求的服務(wù)類型,參數(shù)通過通用寄存器傳遞。 mov r0,#34 ;設(shè)置子功能號為34 swi 12 ;調(diào)用12號軟中斷 指令中的24位立即數(shù)被忽略,用戶請求的服務(wù)類型由寄存器r0的值決定,參數(shù)通過其它的通用寄存器傳遞。 mov r0,#12 ;調(diào)用12號軟中斷 mov r1,#34 ;設(shè)置子功能號為34 swi 0,arm雜項指令軟中斷指令,在swi異常中斷處理程序中,取出swi指令中立即數(shù)的步驟為: 首先確定引起軟中斷的swi指令是arm指令還是thumb指令,這可通過對spsr訪問得到; 然后取得該swi指令的地址,這可通過訪問lr寄存器得到; 接著讀出該swi指令,分解出立即數(shù)。,swi_handler stmfd sp!, r0-r3, r12, lr ; 現(xiàn)場保護 mrs r0, spsr ; 讀取spsr stmfd sp!, r0 ; 保存spsr tst r0, #0x20 ; 測試t標志位 ldrneh r0, lr,#-2 ; 若是thumb指令,讀取指令碼(16位) bicne r0, r0, #0xff00 ; 取得thumb指令的8位立即數(shù) ldreq r0, lr,#-4 ; 若是arm指令,讀取指令碼(32位) biceq r0, r0, #0xff000000 ; 取得arm指令的24位立即數(shù) . ldmfd sp!, r0-r3, r12, pc ; swi異常中斷返回,3.2 指令集介紹,arm指令集狀態(tài)寄存器讀指令,在arm處理器中,只有mrs指令可以對狀態(tài)寄存器cpsr和spsr進行讀操作。通過讀cpsr可以了解當前處理器的工作狀態(tài)。讀spsr寄存器可以了解到進入異常前的處理器狀態(tài)。指令格式如下所示:,“mrs”,3.2 指令集介紹,arm指令集狀態(tài)寄存器讀指令,應(yīng)用示例: mrs r1,cpsr ; 讀取cpsr狀態(tài)寄存器到r1 mrs r2,spsr ; 讀取spsr狀態(tài)寄存器到r2,“mrs”,arm雜項指令狀態(tài)寄存器寫指令,在arm處理器中,只有msr指令可以對狀態(tài)寄存器cpsr和spsr進行寫操作。與mrs配合使用,可以實現(xiàn)對cpsr或spsr寄存器的讀-修改-寫操作,可以切換處理器模式等操作。,“msr”,3.2 指令集介紹,arm指令集狀態(tài)寄存器寫指令,示例,將r0的內(nèi)容寫入cpsr寄存器的控制位域 msr cpsr_c,r0,“msr”,byte0,arm雜項指令狀態(tài)寄存器寫指令,“msr”,啟動代碼堆棧初始化應(yīng)用示例: initstack mov r0,lr ;設(shè)置管理模式堆棧 msr cpsr_c,#0xd3 ldr sp,stacksvc ;設(shè)置中斷模式堆棧 msr cpsr_c,#0xd2 ldr sp,stackirq ,msr cpsr_c,#0xd3,cprs寄存器,arm雜項指令狀態(tài)寄存器寫指令,“msr”,啟動代碼堆棧初始化應(yīng)用示例: initstack mov r0,lr ;設(shè)置管理模式堆棧 msr cpsr_c,#0xd3 ldr sp,stacksvc ;設(shè)置中斷模式堆棧 msr cpsr_c,#0xd2 ldr sp,stackirq ,msr cpsr_c,#0xd2,cprs寄存器,思考與練習,?,1. 使用msr和mrs指令,通過修改cpsr寄存器,實現(xiàn)打開/關(guān)閉irq中斷的兩個子程序,注意不能影響其它位?,(1),(2),(3),(4),;子程序:使能irq中斷 enable_irq mrs r0, cpsr bic r0, r0,#0x80 msr cpsr_c,r0 mov pc,lr,;子程序:禁能irq中斷 disable_irq mrs r0 cpsr orr r0, r0,#0x80 msr cpsr_c,r0 mov pc,lr,1.將cpsr寄存器內(nèi)容讀出到r0;,2.修改對應(yīng)于cpsr中的i控制位;,3.將修改后的值寫回 cpsr寄存器的對應(yīng)控制域;,4.返回上一層函數(shù);,思考與練習,?,arm指令種類,1.存儲器訪問指令 2.數(shù)據(jù)處理指令 3.乘法指令 4.arm分支指令 5.協(xié)處理器指令 6.雜項指令 7.偽指令,3.2 指令集介紹,arm偽指令,arm偽指令不屬于arm指令集中的指令,是為了編程方便而定義的。偽指令可以像其它arm指令一樣使用,但在編譯時這些指令將被等效的arm指令代替。,3.2 指令集介紹,arm偽指令,arm偽指令有四條: 1.小范圍地址讀取指令:adr 2.中等范圍地址讀取指令:adrl 3.大等范圍地址讀取指令:ldr 4.空操作指令:nop,arm偽指令小范圍的地址讀取,adr偽指令將基于pc相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時,adr偽指令被編譯器替換成一條合適的指令,若不能用一條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。,arm偽指令小范圍的地址讀取,地址表達式expr的取指范圍: 當?shù)刂分挡皇亲謱R時,其取指范圍為255; 當?shù)刂分凳亲謱R時,其取指范圍為1020; 當?shù)刂分凳?6字節(jié)對齊時,其取指范圍將更大。,arm偽指令小范圍的地址讀取,. adr r0,delay . delay mov r0,r14 .,應(yīng)用示例(源程序):,使用偽指令將程序標號delay的地址存入r0,. 0x20 add r0,pc,#0x3c . . 0x64 mov r0,r14 .,編譯后的反匯編代碼:,arm偽指令小范圍的地址讀取,. adr r0,delay . delay mov r0,r14 .,應(yīng)用示例(源程序):,使用偽指令將程序標號delay的地址存入r0,. 0x20 add r0,pc,#0x3c . . 0x64 mov r0,r14 .,編譯后的反匯編代碼:,adr偽指令被匯編成一條指令,arm偽指令小范圍的地址讀取,arm偽指令中等范圍的地址讀取,adrl偽指令將基于pc相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中,比adr偽指令可以讀取更大范圍的地址 。在匯編編譯器編譯源程序時,adrl偽指令被編譯器替換成兩條合適的指令。若不能用兩條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。,arm偽指令中等范圍的地址讀取,地址表達式expr的取指范圍: 當?shù)刂分挡皇亲謱R時,其取指范圍為64k 當?shù)刂分凳亲謱R時,其取指范圍為256k 當?shù)刂分凳?6字節(jié)對齊時,其取指范圍將更大,arm偽指令中等范圍的地址讀取,. adrl r0,delay . delay mov r0,r14 .,應(yīng)用示例(源程序):,使用偽指令將程序標號delay的地址存入r0,. 0x20 add r0,pc,#40 0x24 add r0,r0,#0 . 0x68 mov r0,r14 .,編譯后的反匯編代碼:,arm偽指令中等范圍的地址讀取,. adrl r0,delay . delay mov r0,r14 .,應(yīng)用示例(源程序):,使用偽指令將程序標號delay的地址存入r0,. 0x20 add r0,pc,#40 0x24 add r0,r0,#0 . 0x68 mov r0,r14 .,編譯后的反匯編代碼:,adrl偽指令被匯編成兩條指令,盡管第2條指令并沒有意義,arm偽指令大范圍的地址讀取,ldr偽指令用于加載32位的立即數(shù)或一個地址值到指定寄存器。在匯編編譯源程序時,ldr偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出mov或mvn的范圍,則使用mov或mvn指令代替該ldr偽指令,否則匯編器將常量放入文字池,并使用一條程序相對偏移的ldr指令從文字池讀出常量。,地址表達式expr的取指范圍為任意值,arm偽指令大范圍的地址讀取,. ldr r0,=delay . delay mov r0,r14 .,應(yīng)用示例(源程序):,使用偽指令將程序標號delay的地址存入r0,. 0x60 ldr r0,0xb4 . 0x64 mov r0, lr . 0xb4 dcd 0x64,編譯后的反匯編代碼:,arm偽指令大范圍的地址讀取,. ldr r0,=delay . delay mov r0,r14 .,應(yīng)用示例(源程序):,. 0x60 ldr r0,0xb4 . 0x64 mov r0, lr . 0xb4 dcd 0x64,編譯后的反匯編代碼:,ldr偽指令被匯編成一條ldr指令,并在文字池中定義了一個常量,該常量為delay標號的地址,使用偽指令將程序標號delay的地址存入r0,必須加入”=”,3.2 指令集介紹,nop偽指令在匯編時將會被代替成arm中的空操作,比如可能是“mov r0,r0”指令等。nop可用于延時操作。 指令格式:,“nop”,arm偽指令空操作偽指令,思考與練習,?,1.請使用nop偽指令、比較指令、條件跳轉(zhuǎn)指令等完成一個軟件延時子程序,延時長度由r0寄存器的數(shù)值控制?,思考與練習,?,1.請使用nop偽指令、比較指令、條件跳轉(zhuǎn)指令等完成一個軟件延時子程序,延時長度由r0寄存器的數(shù)值控制? delay nop ;空操作 nop nop subs r0,r0,#1 ;循環(huán)次數(shù)減一 bne delay ;如果循環(huán)未結(jié)束,跳轉(zhuǎn)delay繼續(xù) mov pc,lr ;子程序返回,1. arm處理器的尋址方式 共有9種尋址方式; 2. arm指令的特點 可條件執(zhí)行、可選擇影響標志位、具有非常靈活的第二操作數(shù); 3. arm指令的種類,它能完成哪些功能 共有7類指令,可以完成存儲器訪問、數(shù)據(jù)運算、程序跳轉(zhuǎn)、處理器控制、以及幫助編程的偽指令等。,本章學習重點,第4章 目錄,1.arm處理器尋址方式 2.指令集介紹 arm指令集 thumb指令集,3.2 指令集
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代生產(chǎn)環(huán)境中的安全風險評估
- 校園文化活動在校園生活中的實踐與影響
- 生態(tài)保護與產(chǎn)業(yè)變革的共融之路
- 海外擴張與知識產(chǎn)權(quán)保護的跨文化視角
- 油氣運輸中的安全可靠管道安裝技術(shù)研究
- 環(huán)保視角下的白水泥生產(chǎn)質(zhì)量控制
- 2024秋八年級物理上冊 第2章 聲現(xiàn)象 第3節(jié) 聲的利用說課稿2(新版)新人教版
- Unit5 Music Reading for Writing說課稿-2024-2025學年高中英語人教版(2019)必修第二冊
- 《公頃和平方千米》說課稿-2024-2025學年人教版數(shù)學四年級上冊
- 2023六年級英語下冊 Unit 4 Road safety Period 1說課稿 譯林牛津版
- 人教版PEP英語單詞表三年級到六年級
- 新疆烏魯木齊市2024年中考英語模擬試題(含答案)
- (正式版)JBT 14932-2024 機械式停車設(shè)備 停放客車通-用技術(shù)規(guī)范
- 2024年度-脛腓骨骨折
- 2024年職業(yè)衛(wèi)生技術(shù)人員評價方向考試題庫附答案
- 應(yīng)用密碼學課件
- 紅樓夢詩詞全集
- 礦井通風安全培訓課件
- 2024年中國國際投資促進中心限責任公司招聘高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- 苯胺合成靛紅工藝
- 質(zhì)量保證發(fā)展史和國外相關(guān)標準簡介
評論
0/150
提交評論