嵌入式體系結構及接口技術:第7章 匯編語言程序設計_第1頁
嵌入式體系結構及接口技術:第7章 匯編語言程序設計_第2頁
嵌入式體系結構及接口技術:第7章 匯編語言程序設計_第3頁
嵌入式體系結構及接口技術:第7章 匯編語言程序設計_第4頁
嵌入式體系結構及接口技術:第7章 匯編語言程序設計_第5頁
已閱讀5頁,還剩41頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、1TM第第7章章 匯編語言程序設計匯編語言程序設計本章主要介紹本章主要介紹ARM匯編語言程序設計規匯編語言程序設計規范,以及在匯編語言程序設計中所要注意的范,以及在匯編語言程序設計中所要注意的問題,最后以大量的實例說明匯編語言程序問題,最后以大量的實例說明匯編語言程序設計方法。設計方法。2TM2內容提要內容提要71 ARM編譯環境下匯編語句編譯環境下匯編語句72 GNU環境下匯編語句與編譯說明環境下匯編語句與編譯說明73 ARM匯編語言程序設計規范匯編語言程序設計規范74 ARM匯編語言程序設計實例解析匯編語言程序設計實例解析3TM37.1 ARM編譯環境下匯編語句編譯環境下匯編語句nARM編

2、譯環境下進行匯編語言程序設計的格式編譯環境下進行匯編語言程序設計的格式n匯編語句中的符號規則匯編語句中的符號規則 4TM4 7.1.1 ARM編譯環境下匯編語句格式編譯環境下匯編語句格式nADS環境下環境下ARM匯編語句格式如下:匯編語句格式如下:symbol instruction;commentsymbol directive;commentsymbol pseudo-instruction;comment注意事項:注意事項: 在在ARM編譯環境下編譯環境下ARM匯編語句不能從一行的頂格書匯編語句不能從一行的頂格書寫,寫,在一行語句中,指令的前面必須有空格或在一行語句中,指令的前面必須有空

3、格或TAB符號。符號。5TM5 7.1.2 ARM編譯環境下匯編語句中符號規則編譯環境下匯編語句中符號規則 符號用來表示符號用來表示地址地址(一般為程序標號)、(一般為程序標號)、常量常量和和變量變量。當標號以數字開頭時稱為局部標號當標號以數字開頭時稱為局部標號,只在當前段有效。,只在當前段有效。1.符號命名規則符號命名規則(1)符號由大小寫字母、數字、下劃線組成,且符號是區)符號由大小寫字母、數字、下劃線組成,且符號是區分大小寫的。分大小寫的。(2)局部標號可以用數字開頭,其他的標號不能。)局部標號可以用數字開頭,其他的標號不能。(3)符號在其作用范圍內必須是唯一的。)符號在其作用范圍內必須

4、是唯一的。(4)程序中的符號不要與指令助記符或者偽操作同名。)程序中的符號不要與指令助記符或者偽操作同名。 6TM62.常量:包括數字常量、字符常量、字符串常量和布爾常量常量:包括數字常量、字符常量、字符串常量和布爾常量(1)十進制數,如)十進制數,如535、246。(2)十六進制數,如)十六進制數,如0 x645、0 xff00。(3)n_XXX, n表示表示n進制數,從進制數,從29,XXX是具體的數字。例是具體的數字。例如:如:8_3777(4)字符常量用一對單引號括起來,包括一個單字符或者標)字符常量用一對單引號括起來,包括一個單字符或者標準準C中的轉義字符。例如中的轉義字符。例如A、

5、n。(5)字符串常量由一對雙引號以及由它括住的一組字符串組)字符串常量由一對雙引號以及由它括住的一組字符串組成,包括標準成,包括標準C中的轉義字符。中的轉義字符。如果需要使用雙引號如果需要使用雙引號”或字符或字符$,則必須用,則必須用”和和$代替代替。 (6)布爾常量在表達式中寫為)布爾常量在表達式中寫為TRUE和和FALSE 7.1.2 ARM編譯環境下匯編語句中符號規則編譯環境下匯編語句中符號規則7TM73.變量變量(1)數字變量)數字變量取值范圍為取值范圍為0232-1或或-231231-1;匯編器對關系運算符采;匯編器對關系運算符采用無符號數方式處理,這意味著用無符號數方式處理,這意味

6、著0-1是是FALSE。(2)字符串變量)字符串變量字符串變量由包含在雙引號內的一系列字符組成,最大長字符串變量由包含在雙引號內的一系列字符組成,最大長度為度為512字節,最小長度為字節,最小長度為0。當字符串中包含。當字符串中包含$(或或”)時,時,用用$(或或”)表示一個表示一個$(或或”)。(3)邏輯變量)邏輯變量取值范圍為取值范圍為TRUE和和FALSE 7.1.2 ARM編譯環境下匯編語句中符號規則編譯環境下匯編語句中符號規則8TM83.變量變量變量代換規則:程序中的變量可通過代換操作取得一個常量變量代換規則:程序中的變量可通過代換操作取得一個常量n對于數字變量,如果該變量前有對于數

7、字變量,如果該變量前有$字符,在匯編器編譯時字符,在匯編器編譯時將該數字變量的數字轉換成十六進制的串,然后用該十六將該數字變量的數字轉換成十六進制的串,然后用該十六進制串取代進制串取代$字符后的變量。字符后的變量。n對于邏輯變量,如果該變量前有對于邏輯變量,如果該變量前有$字符,在匯編器編譯時字符,在匯編器編譯時將該邏輯變量替換成它的取值(將該邏輯變量替換成它的取值(T或或F)。)。n使用使用“.”來表示變量名的結束。來表示變量名的結束。 7.1.2 ARM編譯環境下匯編語句中符號規則編譯環境下匯編語句中符號規則9TM93.變量變量例:變量代換例:變量代換GBLS string1GBLS st

8、ring2GBLS DGBLA NUMGBLL ISISSETL TRUENUMSETA 0 x11223344DSETS ARM9TDMIstring1 SETS ABC$D$NUM$ISstring2 SETS $string1BBCC 7.1.2 ARM編譯環境下匯編語句中符號規則編譯環境下匯編語句中符號規則10TM104.字符串表達式操作字符串表達式操作(1)取字符串的長度)取字符串的長度LEN語法格式:語法格式::LEN: A功能說明:返回字符串功能說明:返回字符串A的長度。的長度。(2)CHR語法格式:語法格式::CHR: A 功能說明:將功能說明:將A(A為某一字符的為某一字符的

9、ASCII值)轉換為單個字符。值)轉換為單個字符。 7.1.2 ARM編譯環境下匯編語句中符號規則編譯環境下匯編語句中符號規則11TM114.字符串表達式操作字符串表達式操作(3)STR語法格式:語法格式::STR: A 功能說明:功能說明:將將A(A為數字量或邏輯表達式)轉換成字為數字量或邏輯表達式)轉換成字符串。符串。32位數字量轉換成位數字量轉換成8位十六進制數組成的串;邏輯表達位十六進制數組成的串;邏輯表達式轉換成字符串式轉換成字符串T或或F。 7.1.2 ARM編譯環境下匯編語句中符號規則編譯環境下匯編語句中符號規則12TM124.字符串表達式操作字符串表達式操作(4)LEFT返回一

10、個字符串最左端一定長度的字符串:返回一個字符串最左端一定長度的字符串: A :LEFT: B 功能說明:返回字符串功能說明:返回字符串A最左端最左端B(B為返回長度)長度的字符為返回長度)長度的字符串。串。(5)RIGHT返回一個字符串最右端一定長度的字符串:返回一個字符串最右端一定長度的字符串:A :RIGHT: B功能說明:返回字符串功能說明:返回字符串A最右端最右端B(B為返回長度)長度的字符為返回長度)長度的字符串。串。 7.1.2 ARM編譯環境下匯編語句中符號規則編譯環境下匯編語句中符號規則13TM134.字符串表達式操作字符串表達式操作(6)CC用于連接兩個字符串,用于連接兩個字

11、符串,B串接到串接到A串后面:串后面:A :CC: B 7.1.2 ARM編譯環境下匯編語句中符號規則編譯環境下匯編語句中符號規則14TM145.地址標號地址標號 當符號作為程序標號時,其內容為程序語句的地址當符號作為程序標號時,其內容為程序語句的地址。標號分為三種類型:。標號分為三種類型:1)PC相關標號相關標號 :常用來指明一個分支指令的目標地址常用來指明一個分支指令的目標地址;2)寄存器相關標號)寄存器相關標號 :常用于訪問數據段中的數據,由常用于訪問數據段中的數據,由MAP和和FIELD等偽操作來定義等偽操作來定義3)絕對地址)絕對地址 :32位的無符號數字常量,可尋址整個地址位的無符

12、號數字常量,可尋址整個地址空間。空間。 7.1.2 ARM編譯環境下匯編語句中符號規則編譯環境下匯編語句中符號規則15TM156.局部標號局部標號局部標號的語法格式如下:局部標號的語法格式如下:n routname局部標號的引用:局部標號的引用:% F|B A|T nroutname其中:其中:n:局部標號的數字號:局部標號的數字號routname:局部范圍的名稱:局部范圍的名稱F/B:向前:向前/向后搜索,如果未指定則先向前再向后搜索向后搜索,如果未指定則先向前再向后搜索A/T:指示匯編器搜索宏的所有嵌套層次:指示匯編器搜索宏的所有嵌套層次/當前層次,如當前層次,如果未指定匯編器從宏的當前層

13、次到宏的最高層次搜索。果未指定匯編器從宏的當前層次到宏的最高層次搜索。 7.1.2 ARM編譯環境下匯編語句中符號規則編譯環境下匯編語句中符號規則16TM1673 ARM匯編語言程序設計規范匯編語言程序設計規范n匯編器預定義的寄存器名稱匯編器預定義的寄存器名稱 為增加程序的可讀性,為增加程序的可讀性,ARM匯編器自定義了寄存器匯編器自定義了寄存器的別名。在進行程序設計時,程序員可以直接使用這些的別名。在進行程序設計時,程序員可以直接使用這些寄存器名,也可以使用相對應的通用寄存器。寄存器名,也可以使用相對應的通用寄存器。17TM17ARM匯編語言程序設計規范匯編語言程序設計規范 n要提高軟件質量

14、必須降低編碼階段的錯誤率,這要提高軟件質量必須降低編碼階段的錯誤率,這需要制定詳細的需要制定詳細的軟件編程規范軟件編程規范,并培訓每一位程,并培訓每一位程序員,最終的結果可以把編碼階段的錯誤降至序員,最終的結果可以把編碼階段的錯誤降至10%左右,同時會大大的縮短測試時間。左右,同時會大大的縮短測試時間。 18TM181. 符號命名規則符號命名規則2注釋注釋3程序設計的其它要求程序設計的其它要求這三方面的規范要求請參閱教材這三方面的規范要求請參閱教材ARM嵌入式系統結嵌入式系統結構與編程構與編程 159頁頁19TM1974 ARM匯編語言程序設計實例解析匯編語言程序設計實例解析n在嵌入式系統編程

15、中,與硬件直接相關的最底層代在嵌入式系統編程中,與硬件直接相關的最底層代碼要用匯編語言來編寫碼要用匯編語言來編寫;n本節中所設計的實例,意在幫助讀者對嵌入式匯編本節中所設計的實例,意在幫助讀者對嵌入式匯編語言程序設計打下堅實的基礎,同時也為嵌入式硬語言程序設計打下堅實的基礎,同時也為嵌入式硬件底層編程做準備。件底層編程做準備。 20TM20n跳轉指令的應用跳轉指令的應用 用用ARM匯編程序完成以下匯編程序完成以下C語言程序描述的功能語言程序描述的功能(求最大公約求最大公約數):數):int gcd(int a,int b)while (a!=b)if (ab)a=a-b;elseb=b-a;r

16、eturn a; ARM指令功能段舉例指令功能段舉例21TM21n跳轉指令的應用跳轉指令的應用設執行前設執行前R0中存放中存放a, R1中存入中存入b,代碼執行后,代碼執行后R0中存放中存放a和和b的最大公約數。的最大公約數。gcdCMP R0,R1SUBGT R0,R0,R1SUBLT R1,R1,R0BNE gcdMOV PC,LR ARM指令功能段舉例指令功能段舉例22TM22n跳轉指令的應用跳轉指令的應用2. 條件判斷語句條件判斷語句:if(a=0 |b=1)c=d+eCMP R0, #0CMPNE R1,#1ADDEQ R2,R3,R4 ARM指令功能段舉例指令功能段舉例23TM23

17、n跳轉指令的應用3. 循環語句:MOV R0,loopcountloopSUBS R0, R0, #1BNE loop ARM指令功能段舉例指令功能段舉例24TM24求一個數的階乘(求一個數的階乘(64位結果)位結果)用用ARM匯編語言設計程序實現求匯編語言設計程序實現求20!,并將其!,并將其64位結果位結果放在放在R9:R8中。中。MOVR8 , #20;低低32位初始化為位初始化為20MOVR9 , #0;高位初始化為高位初始化為0SUBR0,R8,#1;初始化計數器初始化計數器LoopMOVR1 , R9;暫存高位值暫存高位值UMULLR8 , R9 , R0 , R8;R9:R8=R

18、0*R8MLAR9 , R1 , R0 , R9;R9=R1*R0+R9SUBSR0 , R0 , #1;計數器遞減計數器遞減BNELoop;計數器不為計數器不為0繼續循環繼續循環74ARM匯編語言程序設計實例解析匯編語言程序設計實例解析25TM25在在ARM集成開發環境下編程:集成開發環境下編程:AREA Fctrl, CODE, READONLY ; 聲明代碼聲明代碼FctrlENTRY ; 標識程序入口標識程序入口CODE32 ; 聲明聲明32 位位ARM 指令指令StopBStopEND;文件結束文件結束74ARM匯編語言程序設計實例解析匯編語言程序設計實例解析26TM26n例例7-3

19、 對數據區進行對數據區進行64位結果累加操作。位結果累加操作。 先對內存地址先對內存地址0 x3000開始的開始的100個字內存單元填入個字內存單元填入0 x100000010 x10000064字數據,然后將每個字字數據,然后將每個字單元進行單元進行64位累加結果保存于位累加結果保存于R9:R8。(。(R9中存中存放高放高32位)位)74ARM匯編語言程序設計實例解析匯編語言程序設計實例解析27TM27AREA NUMBERS,DATA,READWRITEdataBuffSPACE 400AREA LEIJIA,CODE,READONLYENTRYCODE32BEGINLDRR0,= dat

20、aBuffMOVR1,#0 x10000001MOVR2,#100loop1 STRR1,R0,#4ADDR1,R1,#1SUBS R2,R2,#1BNEloop174ARM匯編語言程序設計實例解析匯編語言程序設計實例解析28TM28LDRR0,= dataBuffMOVR9,#0MOVR8,#0MOVR2,#100loop2LDRR1,R0,#4ADDS R8,R8,R1ADCR9,R9,#0SUBS R2,R2,#1BNEloop2stopB stopEND74ARM匯編語言程序設計實例解析匯編語言程序設計實例解析29TM29例例7-5 用用ARM指令實現內存數據區塊拷貝操作。指令實現內存

21、數據區塊拷貝操作。內存數據區定義:內存數據區定義:SrcDCD 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18DstSPACE 72將數據從將數據從Src區復制到區復制到Dst區,要求以區,要求以4個字為單位進行批個字為單位進行批量拷貝,不足量拷貝,不足4個字時以字為單位進行拷貝。個字時以字為單位進行拷貝。74ARM匯編語言程序設計實例解析匯編語言程序設計實例解析30TM30NUMEQU18RegListRLISTR5-R8AREA SurDst,DATA,READWRITESurDCD 1,2,3,4,5,6,7,8,9,10,11,12,13,14

22、,15,16,17,18DstSPACE 72AREA blockCopy,CODE,READONLYENTRYCODE32startLDR R2,=SurLDR R3,=DstMOV R0,#NUMMOVS R1,R0,LSR #2BEQ copyWords74ARM匯編語言程序設計實例解析匯編語言程序設計實例解析31TM31copy4wordsLDMIA R2!,RegListSTMIA R3!,RegListSUBS R1,R1,#1BNE copy4wordscopyWordsANDS R0,R0,#3BEQ stopcopyWordLDR R4,R2,#4STR R4,R3,#4SU

23、BS R0,R0,#1BNE copyWordstopB stopEND74ARM匯編語言程序設計實例解析匯編語言程序設計實例解析32TM32n例例7-4 初始化初始化ARM處理器各模式下的堆棧指針處理器各模式下的堆棧指針SP(R13)。)。 設計思路:設計思路:通過通過MRS/MSR指令,采用指令,采用“讀取讀取-修改修改-寫回寫回”三個步驟修改三個步驟修改CPSR模式控制字,使處理器進入相應的模式控制字,使處理器進入相應的模式,在各模式下修改其堆棧指針。模式,在各模式下修改其堆棧指針。74ARM匯編語言程序設計實例解析匯編語言程序設計實例解析33TM33如何設置相應模式下的如何設置相應模式

24、下的SPMRSR0, CPSR;讀取當前讀取當前CPSR BICR0, R0, #0 x1F;清除模式位清除模式位 ORRR1, R0, #0 x1B ; 未定義模式控制字未定義模式控制字 MSRCPSR_c, R1LDRSP, =0 xC7FF20074ARM匯編語言程序設計實例解析匯編語言程序設計實例解析34TM34_ISR_STARTADDRESS EQU 0 xC7FF000 ;設置棧的內存基地址設置棧的內存基地址UserStackEQU _ISR_STARTADDRESS ; 用戶模式堆棧地址用戶模式堆棧地址SVCStackEQU_ISR_STARTADDRESS+256 ;管理模式

25、管理模式UndefStackEQU_ISR_STARTADDRESS+256*2 ;未定義模式未定義模式AbortStackEQU_ISR_STARTADDRESS+256*3; 中止模式中止模式IRQStackEQU_ISR_STARTADDRESS+256*4 ; IRQ模式模式FIQStackEQU_ISR_STARTADDRESS+256*5 ;FIQ模式模式USERMODEEQU 0 x10; 用戶模式控制字用戶模式控制字 FIQMODEEQU 0 x11; FIQ模式控制字模式控制字 IRQMODEEQU 0 x12; IRQ模式控制字模式控制字 SVCMODEEQU 0 x13;

26、 管理模式控制字管理模式控制字 ABORTMODEEQU 0 x17; 中止模式控制字中止模式控制字 UNDEFMODEEQU 0 x1b; 未定義模式控制字未定義模式控制字 SYSMODEEQU0 x1f; 系統模式控制字系統模式控制字 MODEMASKEQU0 x1f; 模式位掩碼控制字模式位掩碼控制字 74ARM匯編語言程序設計實例解析匯編語言程序設計實例解析35TM35AREA Stack_Init, CODE, READONLY ENTRY CODE32 STARTMRSR0, CPSRBICR0, R0, #MODEMASK;清除模式位清除模式位 ;設置系統模式下的設置系統模式下的

27、SPORRR1, R0, #SYSMODEMSRCPSR_c, R1LDRSP, =UserStack;設置未定義模式下的設置未定義模式下的SPORRR1, R0, #UNDEFMODEMSRCPSR_c, R1LDRSP, =UndefStack74ARM匯編語言程序設計實例解析匯編語言程序設計實例解析36TM36例例7-6 內存數據大小端轉換操作。內存數據大小端轉換操作。對內存地址對內存地址0 x9000開始的開始的20個數據內存單元依次填入個數據內存單元依次填入0 x443322010 x44332214,然后進行轉換操作,并存回,然后進行轉換操作,并存回原來的地址。(在原來的地址。(在

28、ADS下編寫)下編寫)74ARM匯編語言程序設計實例解析匯編語言程序設計實例解析37TM37n算術邏輯運算指令的應用轉換內存中數據存儲方式轉換內存中數據存儲方式:設設R0的的4個字節存儲的數據分別為個字節存儲的數據分別為A、B、C、D,要求用一段程序實現將它們的次序反置。要求用一段程序實現將它們的次序反置。EOR R1,R0,R0,ROR #16BIC R1,R1,#0 xFF0000MOV R0,R0, ROR #8EOR R0, R0, R1, LSR #8 ARM指令功能段舉例指令功能段舉例38TM38n算術邏輯運算指令的應用轉換內存中數據存儲方式轉換內存中數據存儲方式:設設R0的的4個

29、字節存儲的數據分別為個字節存儲的數據分別為A、B、C、D,要求用一段程序實現將它們的次序反置。要求用一段程序實現將它們的次序反置。MOV R2, #0 xFFORR R2,R2,#0 xFF0000AND R1,R2,R0AND R0,R2,R0, ROR #24ORR R0,R0,R1,ROR #8 ARM指令功能段舉例指令功能段舉例39TM39例例7-8 實現將寄存器高位和低位對稱換位。實現將寄存器高位和低位對稱換位。換位方式:第換位方式:第0位與第位與第31位互換、第位互換、第1位與第位與第30位互換、位互換、設計思路:設計思路:入口:源數據在入口:源數據在R0出口:結果在出口:結果在R

30、2中中處理過程:處理過程: R0最低位送最低位送R2最低位最低位R0右移一位右移一位 R2左移一位(此過程循環左移一位(此過程循環32次)次)74 ARM匯編語言程序設計實例解析匯編語言程序設計實例解析40TM40例例7-10 把把8421碼數據轉換成整型數據。碼數據轉換成整型數據。8421碼用碼用4位二進制數表示一個十進制位,分別用位二進制數表示一個十進制位,分別用0000 1001表示表示09,設計程序將一個,設計程序將一個8位位8421碼表示的十進制碼表示的十進制數轉換成等價的整型數據。數轉換成等價的整型數據。設計思路:設計思路:入口:源數據在入口:源數據在R0出口:結果在出口:結果在R

31、1中中 計算方法:記計算方法:記R0=ABCDEFGH, 則則R1=(A*10)+B)*10+C)*10+D)*10+G)*10+H)74 ARM匯編語言程序設計實例解析匯編語言程序設計實例解析41TM41例例7-13 實現對字符串的逆序拷貝實現對字符串的逆序拷貝編寫編寫ARM匯編程序,將一個給定的字符串以逆序拷貝到目匯編程序,將一個給定的字符串以逆序拷貝到目標地址中。例如源字符串為標地址中。例如源字符串為“ABCDEFG”,拷貝目標串,拷貝目標串為為“GFEDCBA”。認真分析教材中的程序,用認真分析教材中的程序,用AXD對程序進行調試,回答下對程序進行調試,回答下面的問題:面的問題:1)教材中的源程序是否存在錯誤?)教材中的

溫馨提示

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

評論

0/150

提交評論