ARM匯編程序設計_第1頁
ARM匯編程序設計_第2頁
ARM匯編程序設計_第3頁
ARM匯編程序設計_第4頁
ARM匯編程序設計_第5頁
已閱讀5頁,還剩61頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

ARM嵌入式系統

第5章 ARM匯編程序設計

5.1匯編語言源程序助記符偽指令宏指令匯編指令和機器指令是“一一對應”的匯編語言程序需由匯編程序將其匯編為機器語言程序,才能被計算機執行。匯編語言大體上包括了匯編指令、系統調用和中斷、偽指令和宏指令,匯編語言是強烈依賴硬件和匯編環境的。

學習和使用匯編語言程序設計的原因指令語句(instructions)

完成一定操作功能,能夠翻譯成機器代碼的語句。偽指令語句(directives,指示性語句)

為匯編程序在翻譯匯編語言源程序時提供有關信息,并不翻譯成機器代碼。宏指令語句(marcos) 可看成是由若干條指令語句形成的語句,一條宏指令語句的功能相當于若干條指令語句的功能。ARM程序設計基礎

偽指令宏與宏指令ARM匯編語言規范(語句、表達式和運算符)ARM匯編語言的程序格式5.2偽指令段定義標號符號定義偽指令數據定義偽指令匯編控制偽指令其他偽操作匯編語言程序示例AREA Block, CODE, READONLY num EQU 10 ENTRY

start

LDR R0, =src LDR R1, =dst MOV R2, #numblockcopy LDR R3, [R0], #4 STR R3, [R1], #4 SUBS R2, R2, #1 BNE blockcopy B . AREA BlockData, DATA, READWRITEsrc DCD 0,1,2,3,4,5,6,7,8,9dst SPACE 10*4 END符號定義偽指令定義全局變量: GBLA、GBLL和GBLS定義局部變量: LCLA、LCLL和LCLS變量賦值: SETA、SETL、SETS通用寄存器列表定義名稱:RLIST

GBLA、GBLL和GBLSGBLA、GBLL和GBLS 語法格式:

GBLA(GBLL或GBLS) 全局變量名

GBLAobjectsize;全局的數字變量objectsize,為0ObjectsizeSETA0xff

;將該變量賦值為0xff

SPACEobjectsize;引用該變量

GBLLstatusB

;全局的邏輯變量statusB,為{False}statusBSETL{TRUE} ;將該變量賦值為真

全局:作用范圍為包含該變量的源程序LCLA、LCLL和LCLSLCLA、LCLL和LCLS 語法格式: LCLA(LCLL或LCLS) 局部變量名 MACRO ;聲明一個宏$labelmessage$a;宏的原型LCLSerr;聲明一個局部變量err,為空串errSETS“errorno:”;向該變量賦值$label

;代碼INFO0,err:CC::STR:$a;使用該串變量MEND ;宏定義結束

局部:作用范圍為包含該局部變量的宏代碼的一個實例SETA、、SETL、SETSSETA、、SETL和SETS語法格式::變量名SETA((SETL或SETS)表表達式在向變量賦賦值前,必必須先聲明明該變量RLISTRLIST語法格式::名稱 RLIST{寄存存器列表}ContextRLIST{r0-r6,r8,,r10-r12,r15};將寄存器器列表名稱稱定義為Context,,可在ARM指令LDM/STM中通通過該名稱稱訪問寄存存器列表。。排列順序序無關數據定義偽偽指令DCBDCW(DCWU))DCD(DCDU))DCFD((DCFDU)DCFS((DCFSU)SPACEMAPFIELDDCB語法格式::{標號}DCB表表達式表達式取值值范圍:-128~~127;0~255的數字或字字符串。DCB:““=”NullstringDCB““Nullstring””,0;構造一個個以0結尾尾的字符串串DCW(或或DCWU)語法格式::{標號}DCW((或DCWU)表表達式DCW:半半字對齊DCWU::不嚴格半半字對齊。。表達式取值值范圍:-32768~32767;0~65535data1DCW--128,,num1+8;num1必須是已已經定義過過的DCD(或或DCDU)語法格式::{標號}DCD((或DCDU)表表達式DCD:““&”DCD:字字對齊DCDU::不嚴格字字對齊。data1DCD1,5,20;其值為1,5,20data2DCDmemaddr+4;分配一個個字單元,,其值為程程序中標號號memaddr加加4個字節節DCFD((或DCFDU)語法格式::{標號}DCFD(或DCFDU)) 表達式式每個雙精度度的浮點數數占據兩個個字單元。。DCFD::字對齊DCFDU:不嚴格格字對齊DCFD1E308,-4E-100DCFDU 100000,-.1,3.1E26DCFS((或DCFSU)語法格式::{標號}DCFS(或DCFSU)表達達式每個單精度度的浮點數數占據一個個字單元。。DCFS::字對齊DCFSU::不嚴格字對對齊DCFS1E3,-4E-9DCFSU1.0,-.1,3.1E6SPACE語法格式:{標號}SPACE表表達式分配一片連續續的存儲區域域并初始化為為0。其中,,表達式為要要分配的字節節數。SPACE::“%”DatastrucSPACE280;分配連續280字節的的存儲單元并并初始化為0LTORG語法格式:{標號}LTORG說明某個存儲儲區域是用來來暫存數據的的數據緩沖區區——文字池池或數據緩沖沖池。大的代代碼段也可以以使用多個數數據緩沖池。。當程序中使用用LDR之類類的指令訪問問數據緩沖池池時,為防止止越界產生,,通常把數據據緩沖池放在在代碼段的后后面,或者放放在無條件跳跳轉指令或子子程序返回指指令之后,使使得處理器不不會錯誤的將將數據緩沖池池中的數據當當做指令來執執行。AREAExample,CODE,READONLYStartBLFunc1…Func1LDRR1,=0x800MOVPC,LRLRORGDataSPACE40ENDMAP語法格式:MAP表表達式{,基址寄存存器}用于定義一個個結構化的內內存表的首地地址。MAP:“^”通常與FIELD偽指令令配合使用來來定義結構化化的內存表。。MAP fun;定義結構化化內存表,fun就是內內存表的首地地址MAP 0x80,R9;定義結構化化內存表首地地址的值為0x80+R9FILED語法格式:{標號}FIELD表達式式定義一個結構構化內存表中中的數據域。。FILED也可用“#”代替。MAP 0;定義結構化化內存表首地地址為0constaFIELD4;consta的長度為為4字節,相相對位置為0x0constbFIELD4;constb的長度為為4字節,相相對位置為0x4xFIELD8;x的長度為為8字節,相相對位置為0x8yFIELD8;y的長度為為8字節,相相對位置為0x10stringFIELD256;y的長度為為256字節節,相對位置置為0x18MOV R9,#4096LDR R5,[R9,constb];將內存表中中數據域constb讀讀取到R5中中匯編控制偽指指令匯編控制(AssemblyControl)偽指令用用于控制匯編編程序的執行行流程,常用用的匯編控制制偽操作包括括以下幾條::IF、ELSE、ENDIFWHILE、、WENDIF、ELSE、ENDIF語法格式:IF 邏輯表表達式指令序列1ELSE指令序列2ENDIF示例:IFVersion=“1.0””;指令;偽指令ELSE;指令;偽指令ENDIFWHILE、、WEND語法格式:WHILE邏邏輯表達式式指令序列WEND示例:countSETA1WHILEcount<=4countSETAcount+1;codeWEND其他常常用的的偽操操作AREACODE16、、CODE32ENTRYENDEQUIMPORTGET(或或INCLUDE))AREA語法格格式::AREA段段名名屬屬性性1,,屬性性2,,………定義一一個代代碼段段或數數據段段。常用的的屬性性如下下:CODE:用于于定義義代碼碼段,,默認認為READONLY。。DATA:用于于定義義數據據段,,默認認為READWRITE。READONLY:指定定本段段為只只讀,,代碼碼段默默認為為READONLY。READWRITE:指定定本段段為可可讀可可寫,,數據據段的的默認認屬性性為READWRITE。示例::AREAExample,,CODE,READONLY;codeCODE16、、CODE32語法格格式::CODE16((或CODE32))CODE16:其后后的指指令序序列為為16位的的Thumb指指令。。CODE32:其后后的指指令序序列為為32位的的ARM指指令。。示例::AREAChangeState,,CODE,READONLYCODE32;指示示下面面的指指令為為ARM指指令LDRr0,=start+1BXr0;切換換到Thumb狀態態,并并跳轉轉到start處執執行CODE16;指示示下面面的指指令為為Thumb指指令startMOVr1,#10ENTRY語法格格式::ENTRYENTRY偽操操作用用于指指定匯匯編程程序的的入口口點。。在一一個源源文件件里最最多只只能有有一個個ENTRY((可以以沒有有)。。在一一個完完整的的匯編編程序序中至至少要要有一一個ENTRY(當有多多個ENTRY時,,程序序的真真正入入口點點由鏈鏈接器器指定定)。示例::AREAexample,CODE,,READONLYENTRY;應應用用程程序序的的入入口口點點END語法法格格式式::ENDEND偽偽指指令令用用于于通通知知編編譯譯器器已已經經到到了了源源程程序序的的結結尾尾。。示例例::AREAexample,,CODE,,READONLY………ENDEQU語法法格格式式::名稱稱EQU表表達達式式{,,類類型型}EQU::““*”示例例::abcdEQU2;定定義義abcd符符號號的的值值為為2abcdEQUlabel1+16;定定義義abcd符符號號的的值值((label1+16)IMPORT語法法格格式式::IMPORT標標號號{[WEAK]}用于于通通知知編編譯譯器器要要使使用用的的標標號號在在其其他他的的源源文文件件中中定定義義,,但但要要在在當當前前源源文文件件中中引引用用。。示例例::AREAInit,,CODE,,READONLYIMPORTMain;通通知知編編譯譯器器當當前前文文件件要要引引用用標標號號Main,,但但Main在在其其他他源源文文件件中中定定義義………ENDGET((或或INCLUDE))語法法格格式式::GET文文件件名名用于于將將一一個個源源文文件件包包含含到到當當前前的的源源文文件件中中,,并并將將被被包包含含的的源源文文件件在在當當前前位位置置進進行行匯匯編編處處理理。。可可以以使使用用INCLUDE代代替替GET。。使使用用方方法法與與C語語言言中中的的““include””相相似似。。示例例::AREAexample,,CODE,,READONLYGETfile1.s;包包含含源源文文件件file1.sGETC::\project\file2.s;包包含含源源文文件件file2.sGETC:\Programfiles\file3.s;包包含含源源文文件件file3.s5.3宏宏和和宏宏指指令令宏:在在匯匯編編程程序序中中可可以以用用偽偽指指令令MACRO、、MEND為一一個個程程序序段段定定義義一一個個名名稱稱,,在在往往后后的的程程序序中中就就可可以以通通過過這這個個名名稱稱來來使使用用它它所所代代表表的的程程序序段段。。在在源源程程序序被被匯匯編編時時,,該該名名稱稱將將被被替替換換為為它它所所代代表表的的程程序序段段。。宏指指令令:在在ARM中中,,還還有有一一種種匯匯編編器器內內置置的的無參參數數和和標標號號宏,,我我們們把把其其稱稱為為宏宏指指令令。。在在匯匯編編的的時時候候,,這這些些宏宏指指令令也也是是被被替替換換成成一一條條或或兩兩條條真真正正的的ARM或或Thumb指指令令。。ADR、、ADRL、、LDRMACRO、、MEND語法法格格式式::MACRO$標標號號宏名名$參參數數1,,$參參數數2,,…………;;宏名名為為宏宏的的名名稱稱,,為為宏宏在在程程序序中中引引用用名名。。;$參參數數1,,$參參數數2,,…………為為宏宏中中可可以以使使用用的的參參數數。。指令令序序列列;;宏宏定定義義體體MEND規定定::$標標號號為為主主標標號號,,宏宏內內的的所所有有其其他他的的標標號號必必須須由由主主標標號號組組成成。。宏中中的的所所有有標標號號必必須須在在前前面面冠冠以以符符號號$。。宏中中的的參參數數在在匯匯編編時時被被相相應應的的值值替替換換。。示例例::在在ARM中中完完成成測測試試--跳跳轉轉操操作作需需要要兩兩條條指指令令,,定定義義一一條條宏宏指指令令完完成成測測試試--跳跳轉轉操操作作MACRO$labelTestAndBranch$dest,$reg,$cc$label.A1CMP$reg,#0B$cc$destMENDMACRO、、MEND;在在程程序序中中調調用用該該宏宏testTestAndBranchNonZero,r0,NE……NonZero;程程序序被被匯匯編編后后,,宏宏展展開開的的結結果果testCMPr0,#0BNENonZero……NonZeroMEXIT語法法格格式式::MEXITMEXIT用用于于從從宏宏定定義義中中跳跳轉轉出出去去。。宏指令ADRADRLLDRNOPADR--小范圍圍的地址址讀取偽偽指令語法格式式ADR{cond}register,exprcond:可可選的指令執執行條件register:目標標寄存器expr:基基于PC或寄寄存器的地址址表達式,取取值范圍:地址非字對齊齊,-255~255地址字對齊,-1020~1020將基于PC或或寄存器的地地址值讀取到到寄存器中。。ADR偽指令令被替換成一一條合適的指指令(ADD指令或SUB指令))。如果不能能用一條來實實現ADR偽偽指令的功能能,編譯器將將報告錯誤。。ADR-小范范圍的地址讀讀取偽指令示例:startMOVr0,#10;PC值為當當前指令地址址值加8字節節ADRr4,start;本ADR偽偽指令將被編編譯器替換成成;SUBr4,pc,#0xcADRL-中中等范圍的地地址讀取偽指指令語法格式ADRL{cond}register,exprcond:可可選的指令執執行條件register:目標標寄存器expr:基基于PC或寄寄存器的地址址表達式,取取值范圍:地址非字對齊齊,-64KB~64KB地址字對齊,-256KB~256KB將基于PC或或寄存器的地地址值讀取到到寄存器中。。ADRL偽指指令被替換成成兩條合適的的指令。如果果不能用兩條條來實現ADRL偽指令令的功能,編編譯器將報告告錯誤。ADRL-中中等范圍的地地址讀取偽指指令示例:startMOVr0,#10;PC值為當當前指令地址址值加8字節節ADRLr4,start+60000;本ADRL偽指令將被被編譯器替換換成下面兩條條指令;ADDr4,pc,#0xe800;ADDr4,r4,#0x254;60000=0xEA60LDR-大范范圍的地址讀讀取偽指令語法格式LDR{cond}register,==[expr|label-expr]cond:可可選的指令執執行條件register:目標標寄存器expr:32位常數當expr沒沒有超過MOV或MVN指令中的地地址取值范圍圍時,編譯器器用合適的MOV或MVN指令代替替該LDR偽偽指令反之,編譯器器將該常數放放在數據緩沖沖池中,同時時用一條基于于PC的LDR指令讀取取該常數。LDR偽指令令處的PC值值到數據緩沖沖池中目標數數據所在地址址的偏移量要要小于4KB。將32位常數數或者地址值值讀取到寄存存器中。LDR-大范范圍的地址讀讀取偽指令示例1:將0xff0讀讀取到R1中中LDR R1,=0xFF0;匯編后將得得到MOVR1,#0xFF0示例2:將0xfff讀讀取到R1中中LDR R1,=0xFFF;LDRR1,[PC,OFFSET_TO_LPOOL];…;LPOOLDCD0xFFF示例3:將外外部地址ADDR1讀取取到R1中LDR R1,=ADDR1;LDRR1,[PC,OFFSET_TO_LPOOL];…;LPOOLDCDADDR1NOP-空操操作偽指令語法格式NOP5.4匯編編語言的語句句格式ARM(Thumb)匯匯編語言的語語句格式為::{標號}{指令或偽指指令}{;注釋}標號:從一行行的行頭開始始,不能包含含空格指令或偽指令令:指令的前前面必須有空空格或符號注釋:以“;;”開頭每一條指令的的助記符可以以全部用大寫寫、或全部用用小寫,但不允許在一條條指令中大、、小寫混用。語句之間可以以插入空行。。如果一條語句句太長,可將將該長語句分分為若干行來來書寫,在行行的末尾用““\”表示下下一行與本行行為同一條語語句。ARM匯編語語言中的符號號命名規則:符號由大小寫寫字母、數字字以及下劃線線組成符號是區分大大小寫的符號中的所有有字符都是有有意義的符號在其作用用范圍內必須須唯一,即在在其作用范圍圍內不可有同同名的符號程序中的符號號不能與系統統內部變量或或者系統預定定義的符號同同名程序中的符號號通常不要與與指令助記符符或者偽操作作同名。當同同名時,用雙雙豎線將符號號括起來數字常量數字常量是32位的整數數無符號數:0~232-1有符號數時::-231~231-1。EQU:定義數字常常量變量變量有數字變變量、邏輯變變量和字符串串變量數字變量的大大小不應超出出數字變量所所能表示的范范圍邏輯變量只有有兩種取值情情況:真{true}或或假{false}字符串變量的的長度不應超超出字符串變變量所能表示示的范圍GBLA、GBLL、GBLS:聲明全局變量量LCLA、LCLL、LCLS:聲明局部變量量SETA、SETL和SETS:賦值標號表示程序中的的指令或著數數據地址的符符號。目標地址標號號:基于PC的標號位于目標指令令前或者程序序中數據定義義偽操作前的的標號。匯編編時將被處理理成PC值加加上或減去一一個數字常量量。常用于表表示跳轉指令令的目標地址址,或者代碼碼段中的少量量數據。數據或數據區區首地址標號號:基于寄存存器的標號寫在數據或數數據區定義偽偽指令前面的的標號。這種種標號常在寄寄存器間接尋尋址方式中作作為地址寄存存器的首地址址,在偏移量量的配合下對對數據表中的的數據進行讀讀/寫操作。。絕對地址::32位數字字量LDRR0,=0x3FF5000target1LDRR1,0xFFSTRR1,[R0]LDRR0,=0x3FF5008LDRR1,0x01STRR1,[R0]Btarget1ARM匯編編語言中的的表達式表達式由符符號、數值值、單目或或多目操作作符以及括括號組成。。在一個表表達式內各各種元素的的優先級::括號內的表表達式優先先級最高各種操作符符有一定的的優先級相鄰的單目目操作符的的執行順序序為由右到到左,單目目操作符優優先級高于于其他操作作符優先級相同同的雙目操操作符執行行順序為由由左到右數字邏輯字符串表達式常量變量運算符括號數字表達式式整數數字量量示例:aSETA34906AddrDCD0xA10EDCD2_11001010c3SETA8_74007DCQ0x123456789abcdef數字表達式式浮點數字量量單精度浮點點數表示范范圍:3.4e+38~1.18e-38雙精度浮點點數表示范范圍:1.8e+308~2.23e-308示例:DCFD1E308,-4E100DCFS1.0DCFD3.725e15DCFS0x7FC00000DCFD&FFF0000000000000數字表達式式操作符NOT按位位取反:NOT:A+、-、××、/及及MOD算算術操作符符A+B,A-B,A×B,A/B,A:MOD:BROL、ROR、SHL及SHR移位位(循環移移位)

溫馨提示

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

評論

0/150

提交評論