第2章3_ARM匯編程序設(shè)計(jì)_第1頁(yè)
第2章3_ARM匯編程序設(shè)計(jì)_第2頁(yè)
第2章3_ARM匯編程序設(shè)計(jì)_第3頁(yè)
第2章3_ARM匯編程序設(shè)計(jì)_第4頁(yè)
第2章3_ARM匯編程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第二章_3 ARM匯編程序設(shè)計(jì)n在ARM嵌入式系統(tǒng)中,一般用C語(yǔ)言等高級(jí)語(yǔ)言對(duì)各個(gè)應(yīng)用接口模塊功能的實(shí)現(xiàn)進(jìn)行程序設(shè)計(jì),但在某些地方用匯編語(yǔ)言更方便、簡(jiǎn)單。n在一些關(guān)鍵部分,例如用來(lái)初始化電路以及用來(lái)為軟件(高級(jí)語(yǔ)言編寫)做運(yùn)行前準(zhǔn)備的啟動(dòng)代碼必須用匯編語(yǔ)言編寫。n匯編語(yǔ)言的代碼效率很高,一般用于對(duì)硬件的直接控制。編程步驟 1 分析問(wèn)題 2 確定算法 3 確定數(shù)據(jù)分配的存儲(chǔ)單元 4 畫程序流程圖 5 編寫程序ARM源程序文件 文件類型擴(kuò)展名匯編語(yǔ)言源文件.sC語(yǔ)言源文件.cC+源文件.cpp引入文件.INC頭文件.h本章提要本章提要匯編語(yǔ)言程序設(shè)計(jì)實(shí)例匯編語(yǔ)言程序設(shè)計(jì)實(shí)例嵌入式嵌入式C C語(yǔ)言程

2、序設(shè)計(jì)技巧語(yǔ)言程序設(shè)計(jì)技巧匯編語(yǔ)言與匯編語(yǔ)言與C C語(yǔ)言混合編程技術(shù)語(yǔ)言混合編程技術(shù)GNUGNU匯編語(yǔ)言源程序格式匯編語(yǔ)言源程序格式GNU匯編程序基本格式n 使用偽操作.equ定義了幾個(gè)變量并為其賦值。n 用偽操作.global聲明一個(gè)全局變量_strat,在下面就可以看出, _strat一般用于標(biāo)識(shí)程序代碼的開始,即程序的入口點(diǎn)。n .text偽操作表示以下為代碼段,將被編譯到代碼段或者代碼子段。n .end偽操作匯編編譯器源文件的結(jié)束。每一個(gè)匯編模塊必須包含一個(gè).end偽操作,指示本模塊的結(jié)束。 二、二、ARMARM編譯環(huán)境下匯編語(yǔ)句編譯環(huán)境下匯編語(yǔ)句n.global _startn.eq

3、u x,30n.equ y,40n.textn_start:nmov sp,#0 x00000800nmov r0,#xnmov r1,#ynadd r2,r0,r1nstr r2,spnstop:nb stopn.endGNU環(huán)境下匯編語(yǔ)句與編譯說(shuō)明環(huán)境下匯編語(yǔ)句與編譯說(shuō)明 GNU環(huán)境下ARM匯編語(yǔ)言程序設(shè)計(jì)主要是面對(duì)在ARM平臺(tái)上進(jìn)行嵌入式LINUX的開發(fā)。 GNU標(biāo)準(zhǔn)中提供了支持ARM匯編語(yǔ)言的匯編器as(arm-elf-as)、交叉編譯器gcc ld(arm-elf-gcc)和鏈接器ld(arm-elf-ld)。 GNU環(huán)境下ARM匯編語(yǔ)言語(yǔ)句格式如下: 標(biāo)簽:標(biāo)簽: 指令指令/ /偽

4、操作偽操作/ /偽指令偽指令 操作數(shù)操作數(shù) 語(yǔ)句的注釋語(yǔ)句的注釋 GNUGNU環(huán)境下環(huán)境下ARMARM匯編程序編譯匯編程序編譯基本語(yǔ)法基本語(yǔ)法(1) 預(yù)處理 GNU匯編器as的內(nèi)部預(yù)處理包括:移除多余的間隔符代碼中的所有注釋,并將字符常量轉(zhuǎn)換為數(shù)字值。它不作宏處理和文件包含處理,但這些事情可以交由gcc編譯器去做,文件包含可以用.include偽指令來(lái)實(shí)現(xiàn)。(2) 注釋GNU ARM Assembly可識(shí)別的注釋方式有:C風(fēng)格多行注釋符/* . */或GNU單行注釋符“”或“#”。(3) 符號(hào)與C語(yǔ)言基本一致,符號(hào)名由字母、數(shù)字以及_、和.組成,大小寫敏感。段與重定位段與重定位鏈接器ld用于把

5、多個(gè)目標(biāo)文件合并為一個(gè)可執(zhí)行文件。匯編器as生成的目標(biāo)文件都假定從地址0開始,ld為其指定最終的地址。鏈接器ld把目標(biāo)文件中的每個(gè)section都作為一個(gè)整體,為其分配運(yùn)行的地址 符號(hào)說(shuō)明符號(hào)說(shuō)明(1)label lable后面要帶冒號(hào): 例如:_start: b reset_handler。(2)給符號(hào)賦值三種方式:= .set .equ(3)符號(hào)名由數(shù)字、字母或“.”,“_”組成,不可以數(shù)字開頭,大小寫敏感。匯編器預(yù)定義的寄存器名稱匯編器預(yù)定義的寄存器名稱 本章提要本章提要匯編語(yǔ)言程序設(shè)計(jì)實(shí)例匯編語(yǔ)言程序設(shè)計(jì)實(shí)例嵌入式嵌入式C C語(yǔ)言程序設(shè)計(jì)技巧語(yǔ)言程序設(shè)計(jì)技巧匯編語(yǔ)言與匯編語(yǔ)言與C C語(yǔ)

6、言混合編程技術(shù)語(yǔ)言混合編程技術(shù)匯編語(yǔ)言源程序格式匯編語(yǔ)言源程序格式ARMARM匯編語(yǔ)言程序設(shè)計(jì)實(shí)例解析匯編語(yǔ)言程序設(shè)計(jì)實(shí)例解析 u數(shù)據(jù)塊復(fù)制 u兩數(shù)中大者減小者直到零u累加隊(duì)列中所有數(shù)累加隊(duì)列中所有數(shù)u利用跳轉(zhuǎn)表實(shí)現(xiàn)程序跳轉(zhuǎn)u整數(shù)除法 例 1n先對(duì)內(nèi)存地址0 x3000開始的100個(gè)字內(nèi)存單元填入0 x100000010 x10000064字?jǐn)?shù)據(jù),然后將每個(gè)字單元進(jìn)行64位累加結(jié)果保存于R9:R8。(R9中存放高32位)n_start:nMOVR0 , #0X3000初始化寄存器nMOVR1 , #0X10000001nMOVR2 , #100nloop_1:第一次循環(huán)賦值nSTRR1 , R

7、0,#4nADDR1 , R1,#1nSUBSR2 , R2,#1nBNEloop_1nMOVR0 , #0X3000nMOVR2 , #100nMOVR9 , #0nMOVR8 , #0nloop_2:第二次循環(huán)累加nLDRR1 , R0,#4nADDSR8 , R1,R8 R8=R8+R1,進(jìn)位影響標(biāo)志位nADCR9 , R9 , #0 R9=R9+C,C為進(jìn)位nSUBSR2 , R2 , #1nBNEloop_2用ARM指令編寫程序,將兩數(shù)中的大數(shù)減小數(shù)直至減到結(jié)果為0為止。例 2程序如下:.text_start: MOVr0, #9 MOVr1, #15 CMPr0, r1;r0 -r

8、1即兩數(shù)比較 SUBLTr1, r1, r0;r1 r0,則r1=r1 r0 SUBGTr0, r0, r1;r0 r1,則r0=r0 r1 BNEstart ;r0 r1,則轉(zhuǎn)start繼續(xù)stop B stopEND寫一段 ARM匯編程序:循環(huán)累加隊(duì)列中的所有元素,直到碰上零值元素,結(jié)果放在r4。源程序末尾處聲明隊(duì)列: Myarray DCD 0 x11 DCD 0 x22 DCD 0r0 指向隊(duì)列頭: ADR r0, myarray 使用命令 LDR r1, r0, #4來(lái)裝載,累加至 r4之中,循環(huán)直到r1為0,用死循環(huán)來(lái)停止。例 3源程序如下:AREA total, CODEENTR

9、Y MOV r4, #0 ;設(shè)置初始值 ADRr0, arrayloop LDRr1,r0, #4 ;基址指針 r0自動(dòng)增加 ADDr4, r4, r1 CMPr1, #0 BNEloop ;r1為0時(shí)中斷循環(huán)stop B stop ;死循環(huán)Array DCD 0 x11 ;聲明隊(duì)列 DCD 0 x22 DCD 0END利用跳轉(zhuǎn)表實(shí)現(xiàn)程序跳轉(zhuǎn)。 在程序中常需要根據(jù)一定的參數(shù)選擇執(zhí)行不同的子程序。本例跳轉(zhuǎn)表中存放的是各子函數(shù)的地址,選擇不同的子程序的參數(shù)是該子程序在跳轉(zhuǎn)表中的偏移量。在本例中,R3寄存器中存放的是跳轉(zhuǎn)表的基地址,即存放子程序的入口地址的跳轉(zhuǎn)表的首地址。 R0寄存器的值用于選擇不同

10、的子程序:當(dāng)R0為0時(shí),選擇的是子程序DoAdd;當(dāng)R0為1時(shí),選擇的是子程序DoSub。例 4在ADS編譯環(huán)境下,程序如下:AREA Jump,CODE,READONLY ;設(shè)置本段程序的名稱及屬性NUM EQU 2 ;跳轉(zhuǎn)表中的子程序個(gè)數(shù)ENTRY ;程序執(zhí)行的入口點(diǎn)Start MOV R0, #0;設(shè)置參數(shù),R0中為需調(diào)用哪個(gè)子程序 MOV R1, #3; R1為子程序要用的參數(shù) MOV R2, #2 ; R2為子程序要用的參數(shù) BL Func ;調(diào)用子程序Func,進(jìn)行算術(shù)運(yùn)算stop MOV R0, #0 x18 ;軟中斷參數(shù)設(shè)置 LDR R1, =0 x20026 ;軟中斷參數(shù)設(shè)置

11、 SWI 0 x123456 ;將CPU的控制權(quán)交給調(diào)試器Func CMP R0,#NUM ;判斷R0是否在有效范圍之內(nèi) MOVHS PC,LR ;如果超出范圍則程序返回 ADR R3,JTable ;讀取跳轉(zhuǎn)表的基地址 LDR PC,R3,R0,LSL #2;根據(jù)R0的值跳轉(zhuǎn)到相應(yīng)的子程序Jtable DCD DoAdd ;當(dāng)R0為0時(shí)上面的代碼將跳轉(zhuǎn)到DoAdd DCD DoSub ;當(dāng)R0為1時(shí)上面的代碼將跳轉(zhuǎn)到DoSubDoAdd ADD R0,R1,R2 ;子程序DoAdd執(zhí)行加法操作 MOV PC,LR ;子程序返回DoSub SUB R0,R1,R2;子程序DoAdd執(zhí)行減法操作

12、 MOV PC,LR ;子程序返回 END ;結(jié)束匯編例 5n實(shí)現(xiàn)整數(shù)除法,整數(shù)用補(bǔ)碼表示。先將被除數(shù)和除數(shù)高位對(duì)齊,如果夠減上商1,并減去除數(shù);否則上商0。然后右移除數(shù)1位,重復(fù)上述操作。n.global _startn.macro mCLZ Rd, Rs 求一個(gè)數(shù)的前導(dǎo)0個(gè)數(shù)nMOVRd, #0 在某些ARM中,可使用指令CLZ代替n_mCLZ_L1:nTSTRs, #0 x80000000nADDEQ Rd, Rd, #1nMOVEQRs, Rs, ROR #31 左移一位nBEQ_mCLZ_L1nMOVRs, Rs, LSR Rdn.endm n.macro mUNSIGN Rd, R

13、s 將一個(gè)數(shù)無(wú)符號(hào)化nTST Rs, #0 x80000000 將無(wú)符號(hào)的整數(shù)放到Rs中nEORNE Rd, Rd, #1 將符號(hào)部分放到Rd中nMVNNE Rs, RsnADDNE Rs, Rs, #1n.endmn.textn_start:nLDRR0, =-123456 被除數(shù)nLDRR1, =523 除數(shù)nDiv:nMOVR6, #0 結(jié)果的符號(hào)位nmUNSIGNR6, R0 無(wú)符號(hào)化nmUNSIGNR6, R1nMOVR5, #0 商nCMPR0, R1 如果被除數(shù)小于除數(shù)nBLTDivision_L2 直接商0nmCLZR3, R1 判斷除數(shù)位數(shù),確定移位情況nSUBR3, R3,

14、 #1nMOVR1, R1, LSL R3nDivision_L1:nMOVR5, R5, LSL #1nCMPR0, R1 判斷是否夠減nSUBGTR0, R0, R1 如果夠減,做減法,上商1nORRGTR5, R5, #1nSUBSR3, R3, #1nMOVCSR1, R1, LSR #1nBCS Division_L1nDivision_L2:nTSTR6, #1 處理結(jié)果的符號(hào)nMVNNER5, R5nADDNER5, R5, #1nDivision_F:nMOVR1, R0nMOVR0, R5例 6n用Thumb指令實(shí)現(xiàn)內(nèi)存數(shù)據(jù)區(qū)塊拷貝操作。n .global_startn.eq

15、uNUM,18設(shè)置要復(fù)拷貝的字?jǐn)?shù)n.textn_start:n.armnMOVSP, #0 x9000nADRR0, Thumb_start + 1nBXR0 n.thumbnThumb_start:nLDRR0, =Src R0 = 源數(shù)據(jù)區(qū)指針nLDRR1, =Dst R1 = 目標(biāo)數(shù)據(jù)區(qū)指針n MOVR2, #NUMnLSRR3, R2, #2獲得塊拷貝的次數(shù)nBEQCopy_WordsnPUSHR4-R7 保存將要使用的寄存器R4-R7nCopy_4Word:進(jìn)行塊拷貝,每次拷貝4個(gè)字nLDMIAR0!, R4-R7nSTMIAR1!, R4-R7nSUBR3, #1nBNECopy_

16、4WordnPOPR4-R7恢復(fù)寄存器R4-R7nThumb_start:將剩余的數(shù)據(jù)區(qū)以字為單位拷貝nCopy_Words:nMOVR3, #3nANDR2, R3 獲得剩余的數(shù)據(jù)的字?jǐn)?shù)nBEQStopnCopy_Word:nLDMIAR0!, R3nSTMIAR1!, R3nSUBR2, #1nBNECopy_WordnStop:nBStopn.ltorgnSrc:n.long1,2,3,4,5,6,7,8,9,0 xA,0 xB,0 xC,0 xD,0 xE,0 xF,0 x10,0 x11,0 x12nDst:n.long0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

17、0,0,0,0n.end文件結(jié)束本章提要本章提要匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì)嵌入式嵌入式C C語(yǔ)言程序設(shè)計(jì)技巧語(yǔ)言程序設(shè)計(jì)技巧匯編語(yǔ)言與匯編語(yǔ)言與C C語(yǔ)言混合編程技術(shù)語(yǔ)言混合編程技術(shù)匯編語(yǔ)言源程序格式匯編語(yǔ)言源程序格式4.3 嵌入式C語(yǔ)言程序設(shè)計(jì)技巧變量定義變量定義參數(shù)傳遞參數(shù)傳遞循環(huán)條件循環(huán)條件以空間換時(shí)間以空間換時(shí)間數(shù)學(xué)方法解決問(wèn)題數(shù)學(xué)方法解決問(wèn)題使用位操作使用位操作嵌入?yún)R編嵌入?yún)R編一、變量定義 在變量聲明的時(shí)候,最好把所有相同類型的變量放在一起定義,這樣可以優(yōu)化存儲(chǔ)器布局。由下例可以看出: 對(duì)于局部變量類型的定義,使用short或char來(lái)定義變量并不是總能節(jié)省存儲(chǔ)空間。有時(shí)使用3

18、2位int或unsinged int局部變量更有效率一些,如下圖所示:變量定義中,為了精簡(jiǎn)程序,程序員總是竭力避免使用冗余變量。但有時(shí)使用冗余變量可以減少存儲(chǔ)器訪問(wèn)的次數(shù)這可以提高系統(tǒng)性能。 二、參數(shù)傳遞 為了使單獨(dú)編譯的C語(yǔ)言程序和匯編程序能夠互相調(diào)用,定義了統(tǒng)一的函數(shù)過(guò)程調(diào)用標(biāo)準(zhǔn)ATPCS。ATPCS定義了寄存器組中的R0R3作為參數(shù)傳遞和結(jié)果返回寄存器,如果參數(shù)數(shù)目超過(guò)四個(gè),則使用堆棧進(jìn)行傳遞。 內(nèi)部寄存器的訪問(wèn)速度是遠(yuǎn)遠(yuǎn)大于存儲(chǔ)器的,所以要盡量使參數(shù)傳遞在寄存器里面進(jìn)行,即應(yīng)盡量把函數(shù)的參數(shù)控制在四個(gè)以下。 三、循環(huán)條件 計(jì)數(shù)循環(huán)是程序中十分常用的流程控制結(jié)構(gòu),一般有以下兩種形式: f

19、or for (loop=1loop=1;loop=limitloop=limit;loop+loop+) for for (looploop= =limitlimit;looploop!=!=0 0;looploop-)這兩種循環(huán)形式在邏輯上并沒(méi)有效率差異,但是映射到具體的體系結(jié)構(gòu)中時(shí),就產(chǎn)生了很大的不同,如下圖所示。 四、以空間換時(shí)間 計(jì)算機(jī)程序中最大的矛盾是空間和時(shí)間的矛盾,從這個(gè)角度出發(fā)逆向思維來(lái)考慮程序的效率問(wèn)題,比如若系統(tǒng)的實(shí)時(shí)性要求很高,內(nèi)存還有剩余,則我們就有可以用以空間換時(shí)間的方法來(lái)提高程序執(zhí)行的效率。 五、數(shù)學(xué)方法解決問(wèn)題 數(shù)學(xué)是計(jì)算機(jī)之母,計(jì)算機(jī)的發(fā)展是以數(shù)學(xué)為依據(jù)和基礎(chǔ)

20、的,所以在編寫程序的時(shí)候,適當(dāng)?shù)夭捎靡恍?shù)學(xué)方法會(huì)對(duì)程序的執(zhí)行效率有數(shù)量級(jí)的提高,如下例所示: 六、使用位操作 一般的位操作是用來(lái)控制硬件的,或者做數(shù)據(jù)變換使用,但是,靈活的位操作可以減少除法和取模的運(yùn)算有效地提高程序運(yùn)行的效率,如下例所示: 七、嵌入?yún)R編 匯編語(yǔ)言是效率最高的計(jì)算機(jī)語(yǔ)言,但是它地可讀性較差,因此在C語(yǔ)言編程中為了獲得程序的高效率,我們可以采用變通的方法-嵌入?yún)R編、混合編程。 本章提要本章提要匯編語(yǔ)言上機(jī)過(guò)程匯編語(yǔ)言上機(jī)過(guò)程嵌入式嵌入式C C語(yǔ)言程序設(shè)計(jì)技巧語(yǔ)言程序設(shè)計(jì)技巧匯編語(yǔ)言與匯編語(yǔ)言與C C語(yǔ)言混合編程技術(shù)語(yǔ)言混合編程技術(shù)匯編語(yǔ)言源程序格式匯編語(yǔ)言源程序格式匯編語(yǔ)言與C

21、語(yǔ)言混合編程技術(shù)nARM體系結(jié)構(gòu)支持ARM的匯編語(yǔ)言與C與C+的混合編程.一般的在一個(gè)完整的程序設(shè)計(jì)的中,除了初始化部分用匯編語(yǔ)言完成外,其大部分的編程任務(wù)一般都用C或C+完成。一、ATPCS介紹 ATPCS(ARM-Thumb Produce Call Standard)是ARM程序和Thumb程序中子程序調(diào)用的基本規(guī)則,目的是為了使單獨(dú)編譯的C語(yǔ)言程序和匯編程序之間能夠相互調(diào)用。這些基本規(guī)則包括子程序調(diào)用過(guò)程中寄存器的使用規(guī)則數(shù)據(jù)棧的使用規(guī)則參數(shù)的傳遞規(guī)則 1. 寄存器的使用規(guī)則子程序間通過(guò)寄存器R0R3來(lái)傳遞參數(shù),這時(shí),寄存器R0R3可以記作A1A4。 在子程序中,使用寄存器R4R11來(lái)

22、保存局部變量。這時(shí),寄存器 R4R11可以記作V1V8。在Thumb程序中,通常只能使用寄存器R4R7來(lái)保存局部變量 。寄存器R12用作子程序間的scratch寄存器(用于保存SP,在函數(shù)返回時(shí)使用該寄存器出棧),記作ip。 寄存器R13用作數(shù)據(jù)棧指針,記作sp。 寄存器R14稱為鏈接寄存器,記作lr。 寄存器R15是程序計(jì)數(shù)器,記作pc。 寄存器別名特殊名使用規(guī)則R0a1參數(shù)/結(jié)果scratch寄存器1R1a2參數(shù)/結(jié)果scratch寄存器2R2a3參數(shù)/結(jié)果scratch寄存器3R3a4參數(shù)/結(jié)果scratch寄存器4R4v1ARM狀態(tài)局部變量寄存器1R5v2ARM狀態(tài)局部變量寄存器2R6

23、v3ARM狀態(tài)局部變量寄存器3R7v4wrARM狀態(tài)局部變量寄存器4Thumb狀態(tài)工作寄存器R8v5ARM狀態(tài)局部變量寄存器5R9v6sbARM狀態(tài)局部變量寄存器6,在支持RWPI的ATPCS中為靜態(tài)基址寄存器R10v7slARM狀態(tài)局部變量寄存器7,在支持?jǐn)?shù)據(jù)棧檢查的ATPCS中為數(shù)據(jù)棧限制指針R11v8fpARM狀態(tài)局部變量寄存器8/幀指針R12ip子程序內(nèi)部調(diào)用的scratch寄存器R13sp數(shù)據(jù)棧指針R14lr連接寄存器R15pc程序計(jì)數(shù)器2. 數(shù)據(jù)棧的使用規(guī)則n 根據(jù)堆棧指針指向位置的不同 和增長(zhǎng)方向的不同可以分為以下4種數(shù)據(jù)棧 : FD (Full Descending) 滿遞減

24、ED (Empty Descending) 空遞減 FA (Full Ascending) 滿遞增 EA (Empty Ascending) 空遞增 ATPCS規(guī)定數(shù)據(jù)棧為FD(滿遞減)類型,并且對(duì)數(shù)據(jù)棧的操作是8字節(jié)對(duì)齊的。 3. 參數(shù)的傳遞規(guī)則參數(shù)個(gè)數(shù)固定的子程序參數(shù)傳遞規(guī)則: 第一個(gè)整數(shù)參數(shù),通過(guò)寄存器R0R3來(lái)傳遞。其他參數(shù)通過(guò)數(shù)據(jù)棧傳遞。 參數(shù)個(gè)數(shù)可變的子程序參數(shù)傳遞規(guī)則: 當(dāng)參數(shù)不超過(guò)4個(gè)時(shí),可以使用寄存器R0R3來(lái)傳遞參數(shù);當(dāng)參數(shù)超過(guò)4個(gè)時(shí),還可以使用數(shù)據(jù)棧來(lái)傳遞參數(shù) 子程序結(jié)果返回規(guī)則: 結(jié)果為一個(gè)32位的整數(shù)時(shí),可以通過(guò)寄存器R0返回;結(jié)果為一個(gè)64位整數(shù)時(shí),可以通過(guò)寄存器R

25、0和R1返回,依次類推。 二、內(nèi)嵌匯編 在C程序中嵌入?yún)R編程序可以實(shí)現(xiàn)一些高級(jí)語(yǔ)言沒(méi)有的功能,并可以提高執(zhí)行效率。armcc和armcpp內(nèi)嵌匯編器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。 內(nèi)嵌的匯編指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的變量定義,數(shù)據(jù)交換必須通過(guò)ATPCS進(jìn)行。嵌入式匯編在形式上表現(xiàn)為獨(dú)立定義的函數(shù)體。 1. 內(nèi)嵌匯編指令的語(yǔ)法格式 n_asm(“指令;指令”); ARM C匯編器使用關(guān)鍵字“_ asm。如果有多條匯編指令需要嵌入,可以用“”將它們歸為一條語(yǔ)句。如:_ asm 指令;指令 指令 n需要特別注意的是_asm是兩個(gè)下劃

26、線。 2. 內(nèi)嵌的匯編指令的特點(diǎn) 操作數(shù)可以是寄存器、常量或C表達(dá)式。它們可以是char、short或者int類型,而且是作為無(wú)符號(hào)數(shù)進(jìn)行操作 。內(nèi)嵌的匯編指令中使用物理寄存器有一些限制。常量前的符號(hào)“#”可以省略 只有指令B可以使用C程序中的標(biāo)號(hào),指令BL不能使用C程序中的標(biāo)號(hào)。 不支持匯編語(yǔ)言中用于內(nèi)存分配的偽操作。指令中如果包含常量操作數(shù),該指令可能會(huì)被匯編器展開成幾條指令。 3. 內(nèi)嵌匯編器與armasm匯編器的區(qū)別 內(nèi)嵌匯編器不支持通過(guò)“”指示符或PC獲取當(dāng)前指令地址; 不支持LDR Rn,= expression偽指令,而使用MOV Rn, expression指令向寄存器賦值;

27、不支持標(biāo)號(hào)表達(dá)式;不支持ADR和ADRL偽指令; 不支持BX和BLX指令; 不可以向PC賦值; 使用0 x前綴替代“”表示十六進(jìn)制數(shù)。 4. 內(nèi)嵌匯編注意事項(xiàng) 必須小心使用物理寄存器,如R0R3,LR和PC。 不要使用寄存器尋址變量。 使用內(nèi)嵌匯編時(shí),編譯器自己會(huì)保存和恢復(fù)它可能用到的寄存器,用戶無(wú)須保存和恢復(fù)寄存器。 LDM和STM指令的寄存器列表只允許物理寄存器。 匯編語(yǔ)言用“,”作為操作數(shù)分隔符 三、C和ARM匯編程序間相互調(diào)用 在C和ARM匯編程序之間相互調(diào)用必須遵守ATPCS(ARM-Thumb Procedure Call Standard)規(guī)則。C和匯編之間的相互調(diào)用可以從以下這

28、三方面來(lái)介紹:匯編程序?qū)全局變量的訪問(wèn)在C語(yǔ)言程序中調(diào)用匯編程序在匯編程序中調(diào)用C語(yǔ)言程序1. 匯編程序訪問(wèn)全局C變量 n 匯編程序可以通過(guò)地址間接訪問(wèn)在C語(yǔ)言程序中聲明的全局變量。通過(guò)使用IMPORT關(guān)鍵詞引人全局變量,并利用LDR和STR指令根據(jù)全局變量的地址可以訪問(wèn)它們。n 對(duì)于不同類型的變量,需要采用不同選項(xiàng)的LDR和STR指令,如下所示: unsigned char LDRB/STRBunsigned short LDRH/STRHunsigned intLDR/STRchar LDRSB/STRSBshort LDRSH/STRSH nAREA globals,CODE,READ

29、ONLYnEXPORT asmsubroutine;nIMPORT globvarnasmsubroutinenLDR R1,=globvar ;從文字池讀globvar的地n ;址,并將其保存到R1nLDR R0,R1 ;再將其值讀入到寄存器R0中nADD R0,R0,#2nSTR R0,R1 ;修改后再將寄存器R0的值n ;賦予變量globvarnMOV PC,LRnEND2. 在C語(yǔ)言程序中調(diào)用匯編程序n 為了保證程序調(diào)用時(shí)參數(shù)的正確傳遞,匯編程序的設(shè)計(jì)要遵守ATPCS。在匯編程序中需要使用EXPORT偽操作來(lái)聲明,使得本程序可以被其它程序調(diào)用。同時(shí),在C程序調(diào)用該匯編程序之前需要在C語(yǔ)言程序中使用extern關(guān)鍵詞來(lái)聲明該匯編程序。 nC源程序源程序:n# include ne

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論