嵌入式系統(tǒng)第三章ARM指令系統(tǒng)ppt課件_第1頁
嵌入式系統(tǒng)第三章ARM指令系統(tǒng)ppt課件_第2頁
嵌入式系統(tǒng)第三章ARM指令系統(tǒng)ppt課件_第3頁
嵌入式系統(tǒng)第三章ARM指令系統(tǒng)ppt課件_第4頁
嵌入式系統(tǒng)第三章ARM指令系統(tǒng)ppt課件_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第三章第三章 ARM指令系統(tǒng)指令系統(tǒng)3.1 數據處理指令數據處理指令3.2 數據傳送指令數據傳送指令3.3 控制流指令控制流指令3.4 匯編語言程序匯編語言程序UUNND DA AB BOOR RT TS SV VC CI IR RQQF FI IQQS SY YS SR0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LP)R15(PC)UUs se er r模模式式ARM編編程程模模型型CPSRALU數數據據處處理理指指令令A AD DD D數數據據移移動動指指令令M MO OV VRAMI/O數數據據裝裝載載指指令令L LO OA AD D/ /S ST TO

2、 OR RE E程程序序控控制制指指令令 B B匯編語言的源語句行的一般格式是:匯編語言的源語句行的一般格式是: label instruction | directive|pseudo instruction ;comment 注意: 即使沒有標號,指令、偽指令和命令前面也必須有一個空白,例如一個空格或制表符。 源語句行的所有三部分都是可選的??梢允褂每招衼硎勾a更具可讀性 大小寫規(guī)則 指令記憶碼、命令和符號寄存器名稱可以用大寫或小寫編寫,但不能混合使用大小寫。 標號標號: : 標號是表示地址的符號。在匯編時計算由標號指定的地址。標號是表示地址的符號。在匯編時計算由標號指定的地址。匯編器計算

3、標號的地址,該地址是相對于所定義標號所在匯編器計算標號的地址,該地址是相對于所定義標號所在段的原點的。引用相同段內的一個標號時,可以使用程序段的原點的。引用相同段內的一個標號時,可以使用程序計數器加上或減去一個偏移量。這被稱為相對程序的尋址。計數器加上或減去一個偏移量。這被稱為相對程序的尋址。 其它段中的標號地址是在鏈接時計算的,此時其它段中的標號地址是在鏈接時計算的,此時鏈接程序已在存儲器中為每個段分配了具體的位置。鏈接程序已在存儲器中為每個段分配了具體的位置。 注釋注釋: : 一行中的第一個分號用于標記注釋的開始,但不包括出現一行中的第一個分號用于標記注釋的開始,但不包括出現在一個字符串常

4、數內的分號。行的末尾就是注釋的結束。在一個字符串常數內的分號。行的末尾就是注釋的結束。一個注釋本身就是一個有效的行。匯編程序將忽略所有注一個注釋本身就是一個有效的行。匯編程序將忽略所有注釋。釋。常數常數: : 常數可以數值、布爾值、字符或字符串。常數可以數值、布爾值、字符或字符串。數字數字 可以接受下列形式的數字常數:可以接受下列形式的數字常數:十進制數,如十進制數,如 123 123十六進制數,如,十六進制數,如, 0 x7B 0 x7B布爾值布爾值 布爾常數布爾常數 TRUE TRUE和和 FALSE FALSE 必須書寫為必須書寫為 TRUE TRUE 和和 FALSE FALSE。字符

5、字符 字符常數由左、右單引號組成,中間括住單個字符或一個轉義字符常數由左、右單引號組成,中間括住單個字符或一個轉義字符,采用標準的字符,采用標準的 C C 轉義字符。轉義字符。字符串字符串 字符串由左、右雙引號括住多個字符或空格而組成。如果在一字符串由左、右雙引號括住多個字符或空格而組成。如果在一個字符串內使用了雙引號或美元字符作為文字文本字符,則必須用一個字符串內使用了雙引號或美元字符作為文字文本字符,則必須用一對適當的字符來表示它們。例如,如果需要在字符串內使用單個對適當的字符來表示它們。例如,如果需要在字符串內使用單個 $ $,則必須使用則必須使用 $ $。在字符串常數內可以使用標準的。

6、在字符串常數內可以使用標準的 C C 轉義序列。轉義序列。 ARM 匯編語言模塊的示例匯編語言模塊的示例 AREA ARMex, CODE, READONLY ; Name this block of code ARMex ENTRY ; Mark first instruction to execute start MOV r0, #10 ; Set up parameters MOV r1, #3 ADD r0, r0, r1 ; r0 = r0 + r1 stop MOV r0, #0 x18 ; angel_SWIreason_ReportException LDR r1, =0 x2

7、0196 ; ADP_Stopped_ApplicationExit SVC #0 x123456 ; ARM semihosting (formerly SWI) END ; Mark end of file 3.1 數據處理指令數據處理指令 ARM的數據處理指令使得程序員能夠完成寄存器中數據的算術和邏輯操作。 其他指令只是傳送數據和控制程序的順序。 數據處理指令的典型特征是需要兩個操作數,產生單個結果。 所有的操作數是32位,或來自寄存器、或是指令中定義的立即數。 如果有結果,則結果為32位寬并只能在寄存器中。 每一個操作數寄存器和結果寄存器都在指令中獨立指定,也即ARM指令使用3地址模式

8、。ADDr0, r1, r2 ; r0 := r1 + r2 注意指令中操作數的順序,r0是結果寄存器,然后是第一操作數r1),最后是第二操作數r2)。 當指令執(zhí)行后,對系統(tǒng)狀態(tài)而言唯一的變化是目的寄存器r0的值。 CPSR中的標志位N、Z、C、V也可有選擇地變化。1、算術操作、算術操作 這類指令對兩個32位操作數進行二進制算術操作。 ADD r0 , r1 , r2 ; r0 := r1 + r2 ADC r0 , r1 , r2 ; r0 := r1 + r2 + C SUB r0 , r1 , r2 ; r0 := r1 - r2 SBC r0 , r1 , r2 ; r0 := r1

9、- r2 + C - 12、邏輯操作、邏輯操作這類指令對輸入操作數的對應位進行指定的布爾邏輯操作。 ANDr0 , r1 , r2;r0 i := r1 i and r2 i ORRr0 , r1 , r2;r0 := r1 or r2 EORr0 , r1 , r2;r0 := r1 xor r2 BICr0 , r1 , r2;r0 := r1 and not r23、寄存器傳送操作、寄存器傳送操作 這些指令無第一操作數省略),只是簡單的將第二操作數傳送到結果寄存器。 MOV r0 , r2;r0 := r2 MVN r0 , r2;r0 := not r24、比較操作、比較操作 這類指令

10、不產生結果省略結果寄存器),僅影響CPSR中的相應位N、Z、C、V)。 CMP r1 , r2;r1 - r2 cc CMN r1 , r2 ;r1 + r2 cc TST r1 , r2 ;r1 and r2 cc TEQ r1 , r2 ;r1 xor r2 cc5、立即數操作、立即數操作 因為立即數是在32位指令中編碼,所以不可能將32位都作為立即數,只能是一個8位數并按兩位數為邊界進行的調整。 立即數=(0-255x 22n0=n b) if (a b) a = a a = a b; b; else else b = b b = b a; a; return a; return a;

11、采用下列代碼,可以只用帶條件跳轉來實現 gcd 函數: gcd CMP r0, r1 BEQ end BLT less SUBS r0, r0, r1 ; could be SUB r0, r0, r1 for ARM B gcd less SUBS r1, r1, r0 ; could be SUB r1, r1, r0 for ARM B gcd end 由于跳轉數目的原因,該代碼的長度是七條指令。每次獲得一個跳轉時,處理器必須重填流水線并從新位置繼續(xù)執(zhí)行。其它指令和未執(zhí)行的跳轉各使用一個周期。 通過使用 ARM 指令集的條件執(zhí)行功能,可以僅用四個指令實現 gcd 函數:gcd CMP r

12、0, r1 SUBGT r0, r0, r1 SUBLE r1, r1, r0 BNE gcd END 除了減小了代碼大小之外,此代碼在大多數情況下執(zhí)行速度更快。在這種情況下,用條件執(zhí)行的所有指令來代替跳轉后,可節(jié)省三個周期。當r0 r1 時兩種代碼的執(zhí)行周期數相等。在其他情況下,代碼的條件執(zhí)行的執(zhí)行周期數最少。 所有指令為條件執(zhí)行所有指令為條件執(zhí)行 R0:aR1:bInstruction Cycles(7)12CMP r0, r1 112SUBGT r0,r0,r1 1 (未執(zhí)行) 11SUBLT r1,r1,r0 111BNE gcd 311CMP r0,r1 111SUBGT r0,r0

13、,r1 1 (未執(zhí)行) 11SUBLT r1,r1,r0 1 (未執(zhí)行) 11BNE gcd 1 (未執(zhí)行) 總計 = 10 所有指令為條件跳轉所有指令為條件跳轉 R0:aR1:bInstruction Cycles(7)12CMP r0, r1 112BEQ end 1 (未執(zhí)行) 12BLT less 312SUB r1, r1, r0 112B gcd 311CMP r0, r1 111BEQ end 3總計 = 13 轉移鏈接指令:轉移鏈接指令: 通常要調用子程序,并且當子程序執(zhí)行完時能夠恢復到原來的代碼位置,這就需要把執(zhí)行轉移之前程序計數器r15的值保存下來。 ARM使用轉移鏈接指令

14、BL來提供這一功能。該指令完全像轉移指令一樣執(zhí)行轉移,并將轉移后面緊接的一條指令的地址保存到連接寄存器r14中。BLSUBR; 轉移到SUBR;返回到這里; SUBR;子程序入口MOV pc , r14;返回 注意:由于返回地址保存在r14寄存器里,子程序不應嵌套,否則,新的返回地址將覆蓋原來的返回地址。常規(guī)做法是將r14入棧。BLSUB1; 轉移到SUB1;返回到這里 SUB1STMFD r13! , r0-r2, r14 ;保存現場BLSUB2 SUB2 子程序返回指令:子程序返回指令: 為了返回調用程序,必須將轉移鏈接指令保存在r14中的程序計數器值拷貝到程序寄存器。 SUBR;子程序入

15、口MOV pc , r14;把r14拷貝到r15來返回 對子程序嵌套返回 SUB1STMFDr13 ! , r0-r2 , r14 BLSUB2LDMFDr13 ! , r0-r2 , pc AREA subrout, CODE, READONLY ; Name this block of code ENTRY ; Mark first instruction to execute start MOV r0, #10 ; Set up parameters MOV r1, #3 BL doadd ; Call subroutine stop MOV r0, #0 x18 ; angel_SWI

16、reason_ReportException LDR r1, =0 x20196 ; ADP_Stopped_ApplicationExit SVC #0 x123456 ; ARM semihosting (formerly SWI) doadd ADD r0, r0, r1 ; Subroutine code BX lr ; Return from subroutine END ; Mark end of file監(jiān)控程序調用監(jiān)控程序調用 監(jiān)控程序提供了委托訪問系統(tǒng)資源的方式,對用戶級程序它更像一個專門的子程序入口。指令集包含一個專門的指令SWI,用來調用訪問輸入輸出這類功能。 如:把r0

17、底部字節(jié)中的字符送到顯示器,SWISWI_WriteC;輸出r0 7:0 或,把控制從用戶程序返回到監(jiān)控程序,SWISWI_Exit;返回到監(jiān)控程序跳轉表跳轉表: 跳轉表的思想是程序員有時想調用一系列子程序中的一個,但究竟調用哪一個須由程序的計算值確定(如r0)。 如傳統(tǒng)的,BLJUMPTAB JUMPTAB CMP r0 , #0;假設值在r0BEQSUB0CMP r0 , #1BEQSUB1CMP r0 , #2BEQSUB2;當子程序列表較長時,該方案非常慢。 一個有效的解決方案是利用程序計數器在通用寄存器文件中的可見性來實現的。BLJUMPTAB JUMPTAB ADRr1 , SUB

18、TABCMPr0 , #SUBMAX;如果OKLDRLSpc , r1,r0,LSL #2 ;則進入表中BERROR;否則報警 SUBTABDCDSUB0;子程序表入口DCDSUB1DCDSUB2 ENTRY ; mark the first instruction to callstart MOV r0, #1 ; set up the three parameters MOV r1, #3 MOV r2, #2 BL arithfunc ; call the functionstop MOV r0, #0 x18 ; angel_SWIreason_ReportException LDR

19、r1, =0 x20196 ; ADP_Stopped_ApplicationExit SWI 0 x123456 ; ARM semihosting SWIarithfunc ; label the function CMP r0, #num ; Treat function code as unsigned integer MOVHS pc, lr ; If code is = num then simply return ADR r3, JumpTable ; Load address of jump table LDR pc, r3,r0,LSL#2 ; Jump to the app

20、ropriate routineJumpTable DCD DoAdd DCD DoSubDoAdd ADD r0, r1, r2 ; Operation 0 MOV pc, lr ; ReturnDoSub SUB r0, r1, r2 ; Operation 1 MOV pc,lr ; Return END ; mark the end of this file DCD指示匯編器保留一個字,并將它們初始化為右邊表達式的值標號的地址。 不管表中有多少子程序,以及它們使用的頻度如何互不相關,這種方法的性能不變。 在讀跳轉表時,若超出了表的末端,結果將是災難性的,因而,檢查越限是必須的。 或CM

21、Pr0 , #SUBMAXBHIEERORLDRpc , r1 , r0 , LSL #2 3.4 匯編語言程序匯編語言程序AREAHellow, CODE, READONLY;聲明代碼區(qū)SWI_WriteEQU&0;輸出r0中的字符SWI_ExitEQU&11;程序結束ENTRY;代碼入口STARTADRr1 , TEXT;指針LOOPLDRBr0 , r1 , #1;讀下一字節(jié)CMPr0 , #0;檢查文本終點SWINESWI_Write;打印BNELOOP;SWISWI_Exit;執(zhí)行結束TEXT=“Hellow,World” , &0a , & 0d , 0END;程序結束 這段程序說明了ARM匯編語言和指令集的許多特征: 帶有適當屬性的代碼AREA的聲明; 系統(tǒng)調用的定義; 使用ARD偽指令,以便將地址寫入基址寄存器; 使用自動變址尋址,以掃描一系列字節(jié); SWI指令的條件執(zhí)行,以避免額外的轉移。 使用字節(jié)“0標記字符串回車和換行之后的結束。只要采用循環(huán)結構,就必須保證它有結束的條件。AREABl

溫馨提示

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

評論

0/150

提交評論