ARM嵌入式系統結構與編程課件:第4章 ARM指令集系統_第1頁
ARM嵌入式系統結構與編程課件:第4章 ARM指令集系統_第2頁
ARM嵌入式系統結構與編程課件:第4章 ARM指令集系統_第3頁
ARM嵌入式系統結構與編程課件:第4章 ARM指令集系統_第4頁
ARM嵌入式系統結構與編程課件:第4章 ARM指令集系統_第5頁
已閱讀5頁,還剩47頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

內容提要4.1數據處理指令4.2ARM分支指令4.3加載/存儲指令4.4批量加載/存儲指令4.5交換指令4.6程序狀態寄存器PSR訪問指令4.7協處理器操作指令4.8異常產生指令4.3加載/存儲指令用于操作32位的字類型數據以及8位無符號的字節類型數據;用于操作16位半字類型數據和8位的有符號字節類型數據。字、無符號字節尋址偏移量的提供形式偏移量的作用時間立即數前變址不回寫寄存器前變址回寫寄存器移位后變址回寫4.3.1 加載/存儲字、無符號字節指令1.LDR/STR指令LDR{cond}Rd,<addressing>STR{cond}Rd,<addressing>LDR{cond}TRd,<addressing>STR{cond}TRd,<addressing>4.3.1 加載/存儲字、無符號字節指令1.LDR/STR指令例4-27LDRR0,[R1,#-4]LDRR0,[R1,R6]!LDRR0,[R1],R2,LSL#2STRR0,[R1,#4]!STRR0,[R1],#42.LDRB/STRB指令LDR{cond}BRd,<addressing>STR{cond}BRd,<addressing>LDR{cond}BTRd,<addressing>STR{cond}BTRd,<addressing>2.LDRB/STRB指令例:LDRBR0,[R1,#-4]LDRBR0,[R1,R6]!LDRBR0,[R1],R2,LSL#2STRBR0,[R1,#4]!STRBR0,[R1],#44.3.2 半字、有符號字節訪問指令半字數據訪問指令用于內存中的數據與寄存器低16位數據進行操作,有符號字節訪問指令可實現向寄存器加載8位的有符號字節數據。對于向寄存器加載無符號半字數據,寄存器的高16位bits[31:16]清零;對于向寄存器加載有符號半字數據,寄存器的高16位bits[31:16]用符號位擴展為32位;對于向寄存器加載有符號字節數據,寄存器的高24位bits[31:8]用符號位擴展為32位。STR{cond}HRd,<addressing>LDR{cond}HRd,<addressing>LDR{cond}SHRd,<addressing>LDR{cond}SBRd,<addressing>偏移量的提供形式偏移量的作用時間立即數前變址不回寫寄存器前變址回寫后變址回寫半字、有符號字節尋址例4-29LDRHR0,[R1],#2LDRHR0,[R1,#2]LDRHR0,[R1,R2]STRHR0,[R1]STRHR0,[R1,#2]LDRSBR0,[R1,R2]LDRSHR0,[R1,R2]!4.4批量加載/存儲指令ARM微處理器所支持批量數據加載/存儲指令(LDM/STM)可以一次性實現一片連續的存儲器單元和多個寄存器之間進行傳送數據。根據LDM/STM所實現的操作可以將其分為三類:基本批量字數據加載/存儲指令、用戶模式下的批量字數據加載/存儲指令、帶狀態寄存器的批量字數據加載指令基本批量字數據加載/存儲指令批量加載:LDM{<cond>}<addr_mode><Rn>{!},<registers>批量存儲:STM{<cond>}<addr_mode><Rn>{!},<registers>內存操作批量Load/Store指令在實現寄存器組和連續內存單元中數據傳遞時,地址的變化方式(addr_mode)有以下四種:后增IA(IncrementAfter):每次數據傳送后地址加4;先增IB(IncrementBefore):每次數據傳送前地址加4;后減DA(DecrementAfter):每次數據傳送后地址減4;先減DB(DecrementBefore):每次數據傳送前地址減4;堆棧操作四種類型的堆棧工作方式:滿遞增堆棧(FA)滿遞減堆棧(FD)空遞增堆棧(EA)空遞減堆棧(ED)注意事項:Rn不允許為程序計數器PC(R15)指令中寄存器和連續內存地址單元的對應關系:編號低的寄存器對應內存低地址單元,編號高的寄存器對應內存高地址單元。如果指令中基址寄存器<Rn>在寄存器列表<registers>中,而且指令中尋址方式指定指令執行后更新基址寄存器<Rn>的值,則指令執行會產生不可預知的結果。示例解析閱讀下列代碼段,試分析各個寄存器中的字數據存儲在內存中的位置,并寫出從內存地址0x8FEC開始的20個字節內存地址單元中內容(數據存儲采用小端格式)MOV R1,#0x9000MOV R0,#0x11MOV R2,#0x22MOV R3,#0x33MOV R4,#0x44MOV R5,#0x55STMDB R1!,{R0,R2-R5}存儲情況如下用戶模式下的批量字數據加載/存儲指令用戶模式下的批量字數據加載/存儲指令操作實現的操作是:即使處理器工作在特權模式下,存儲系統也將訪問看成是處理器在用戶模式下,因此所加載/存儲的寄存器組為用戶模式下的寄存器。該指令寄存器列表中不包含程序計數器PC,不允許對基地址寄存器回寫操作。用戶模式下的批量字數據加載/存儲指令匯編語法格式為批量加載:LDM{<cond>}<addr_mode><Rn>,<registers_without_pc>^批量存儲:STM{<cond>}<addr_mode><Rn>,<registers_without_pc>^用戶模式下的批量字數據加載/存儲指令注意事項:寄存器和內存地址單元的對應關系;在用戶模式和系統模式下不要使用本指令;基址寄存器是當前模式下的物理寄存器;不允許對基址寄存器回寫操作。用戶模式下的批量字數據加載/存儲指令帶PSR操作的批量字數據加載指令在帶PSR操作的批量字數據加載指令中,程序計數器PC包含在指令寄存器列表中。該指令將數據從連續的內存單元中讀取到指令中寄存器列表中的各寄存器中。它同時將目前處理器模式對應的SPSR寄存器內容復制到CPSR寄存器中。

批量加載:LDM{<cond>}<addressing_mode><Rn>{!},<registers_with_pc>^帶PSR操作的批量字數據加載指令注意事項:寄存器和內存地址單元的對應關系;如果Rn在Register_list中,而且指令中指定指令執行后更新Rn的值,指令執行會產生不可預知的結果;本指令主要用于從異常模式下返回,在用戶模式和系統模式下使用本指令會產生不可預知的結果。帶PSR操作的批量字數據加載指令示例解析:如何用帶PSR操作的批量字數據加載指令實現IRQ中斷的返回?在進入IRQ中斷處理程序時,首先計算返回地址,并保存相關的寄存器

SUB R14,R14,#4;STMFD R13!,{R0-R3,R12,LR}

如果IRQ中斷處理程序返回到被中斷的進程則執行下面的指令。該指令從數據棧中恢復寄存器R0~R3及R12的值,將返回地址傳送到PC中,并將SPSR_irq值復制到CPSR中

LDMFDR13!,{R0-R3,R12,PC}^4.5交換指令ARM指令支持原子操作,主要是用來對信號量的操作,因為信號量操作的要求是作原子操作,即在一條指令中完成信號量的讀取和修改操作。字數據交換指令SWP是對字數據操作指令,用于將一個寄存器Rn為地址的內存字數據單元的內容讀取到一個寄存器<Rd>中,同時將另一個寄存器Rm的內容寫入到該內存單元中。SWP{<cond>}<Rd>,<Rm>,[<Rn>]字節數據交換指令SWPB是對字節操作指令,用于將一個寄存器Rn為內存地址的字節數據單元的內容讀取到一個寄存器Rd中,寄存器Rd的高24設置為0,同時將另一個寄存器Rm的低8位數值寫入到該內存單元中SWP{<cond>}{B}<Rd>,<Rm>,[<Rn>]例: SWPR0,R1,[R2]

SWPR0,R0,[R2] SWPBR0,R1,[R2]4.6程序狀態寄存器PSR訪問指令程序狀態寄存器PSR訪問指令用來實現通用寄存器與程序狀態寄存器之間的數據傳輸,共有兩條:讀程序狀態寄存器指令MRS和寫程序狀態寄存器指令MSR。這類指令可以用來修改CPSR,通常是通過“讀取-修改-寫回”的操作序列來實現。讀程序狀態寄存器指令MRS指令用于將狀態寄存器的內容傳送到通用寄存器中。這是程序獲得程序狀寄存器PSR數據的唯一方法。MRS{<cond>}<Rd>,CPSRMRS{<cond>}<Rd>,SPSR寫程序狀態寄存器指令MSR指令用于將通用寄存器的內容或一個立即數傳送到程序狀態寄存器中,實現對程序狀態寄存器的修改。

MSR{<cond>} CPSR_<fields>,<operand2>MSR{<cond>} SPSR_<fields>,<operand2>

fields設置狀態寄存器中需要操作的位域。狀態寄存器分為4個8位的域:

bits[31:24]為條件標志位域,用f表示;bits[23:16]狀態位域,用s表示;

bits[15:8]擴展位域,用x表示;

bits[7:0]控制位域,用c表示;第二操作數operand2的構成形式有以下兩種形式:<immediate>為將要傳送到狀態寄存器中的立即數<Rm>寄存器包含將要傳送到狀態寄存器中的數據。注意:MSR只能在特權模式下使用。例4-35用ARM匯編語言編寫代碼,實現將ARM處理器切換到未定義模式,并關閉中斷。MRS R0,CPSRBIC R0,R0,#0x1FORR R1,R0,#0x1B|0xC0MSR CPSR_cxsf,R14.8異常產生指令ARM處理器所支持的異常產生指令有兩條:軟中斷指令SWI斷點調試指令BKPT(用于ARMV5及以上的版本)軟中斷指令SWI(SoftWareInterrupt)指令用于產生軟件中斷,它將處理器置于監控模式(SVC),從地址0x08開始執行指令。ARM通過這種機制實現用戶模式對操作系統中特權模式的程序調用,也就是使用戶程序調用操作系統的系統程序成為可能。語法格式:SWI{<cond>}<immed_24>操作系統在SWI的異常處理程序中提供相應的系統服務,指令中24位的立即數指定用戶程序調用系統例程的類型,相關參數通過通用寄存器傳遞。執行過程:將SWI后面指令地址保存到R14_svc;將CPSR保存到SPSR_svc;進入監控模式,將CPSR[4:0]設置為0b10011;將CPSR[7]設置為[1],禁止IRQ;將PC設置為0x08,并且開始執行那里的指令。返回時:MOVSPC,R14斷點中斷指令BKPT(BreakPoinT)指令產生軟件斷點中斷,可用于程序的調試。當BKPT指令執行時,處理器停止執行下面的指令并進入相應的BKPT入口程序第4章 ARM指令集系統TheEnd算術邏輯運算指令的應用跳轉指令的應用Load/Store指令的應用批量Load/store指令的應用交換指令的應用與系統相關的一些指令的應用ARM指令功能段舉例算術邏輯運算指令的應用1.位操作:將R2中的高8位數據傳送到R3的低8位中MOVR0,R2,LSR#24ORRR3,R0,R3,LSL#82.乘法操作:MOVR0,R0,LSL#nADDR0,R0,R0,LSL#nRSBR0,R0,R0,LSL#nADDR0,R0,R0,LSL#2ADDR0,R1,R0,LSL#1ARM指令功能段舉例算術邏輯運算指令的應用3.64位運算

R0和R1中存放了一個64位數據,其中R0中為低32位;R2和R3中存放了另一個64位數,R2中為低32位。求這兩個數的和,結果保存在R0和R1中。ADDSR0,R0,R2ADCR1,R1,R3如何實現減法?ARM指令功能段舉例算術邏輯運算指令的應用4.轉換內存中數據存儲方式:

設R0的4個字節存儲的數據分別為A、B、C、D,要求用一段程序實現將它們的次序反置。EORR1,R0,R0,ROR#16BICR1,R1,#0xFF0000MOVR0,R0,ROR#8EORR0,R0,R1,LSR#8ARM指令功能段舉例算術邏輯運算指令的應用4.轉換內存中數據存儲方式:

設R0的4個字節存儲的數據分別為A、B、C、D,要求用一段程序實現將它們的次序反置。MOVR2,#0xFFORRR2,R2,#0xFF0000ANDR1,R2,R0ANDR0,R2,R0,ROR#24ORRR0,R0,R1,ROR#8ARM指令功能段舉例跳轉指令的應用

用ARM匯編程序完成以下C語言程序描述的功能(求最大公約數):

int

gcd(int

a,intb) { while(a!=b) if(a>b) a=a-b; else b=b-a; returna; }ARM指令功能段舉例跳轉指令的應用

設執行前R0中存放a,R1中存入b,代碼執行后R0中存放a和b的最大公約數。gcdCMPR0,R1SUBGTR0,R0,R1SUBLTR1,R1,R0BNEgcdMOVPC,LRARM指令功能段舉例跳轉指令的應用2. 條件判斷語句:

if(a==0||b==1) c=d+eCMPR0,#0CMPNER1,#1ADDEQR2,R3,R4ARM指令功能段舉例跳轉指令的應用3. 循環語句:

MOVR0,loo

溫馨提示

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

評論

0/150

提交評論