版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式系統(tǒng)中匯編語(yǔ)言和C語(yǔ)言的混合編程,1嵌入式匯編程序,嵌入式匯編程序是指C編譯器中包含的匯編程序。使用嵌入式匯編程序后,大部分ARM指令和Thumb指令可以直接在C源程序中使用,一些C語(yǔ)言不能完成的操作可以在C程序中實(shí)現(xiàn),程序的代碼效率也比較高。匯編程序中嵌入的匯編指令包括大多數(shù)的ARM指令和Thumb指令,但是由于它嵌入在C程序中,所以在使用上有一些特點(diǎn)。1.1作為嵌入式匯編指令中操作數(shù)的操作數(shù)、寄存器和常數(shù)可以是c表達(dá)式。這些表達(dá)式可以是char類(lèi)型、short類(lèi)型或int類(lèi)型,它們都是無(wú)符號(hào)數(shù)字。如果需要有符號(hào)的數(shù)字,用戶需要自己處理與符號(hào)相關(guān)的操作。編譯器將計(jì)算這些表達(dá)式的值,并為
2、它們分配寄存器。當(dāng)在匯編指令中使用物理寄存器和C的表達(dá)式時(shí),應(yīng)該注意所使用的表達(dá)式不應(yīng)該太復(fù)雜。因?yàn)楸磉_(dá)式太復(fù)雜,將需要更多的物理寄存器,這可能與指令中物理寄存器的使用相沖突。當(dāng)編譯器發(fā)現(xiàn)寄存器分配沖突時(shí),會(huì)產(chǎn)生相應(yīng)的錯(cuò)誤信息,并報(bào)告寄存器分配沖突。1.2物理寄存器,在嵌入式匯編指令中使用物理寄存器有一些限制:不能直接給個(gè)人計(jì)算機(jī)寄存器賦值,程序跳轉(zhuǎn)只能通過(guò)B指令和BL指令來(lái)實(shí)現(xiàn)。在使用物理寄存器的嵌入式匯編指令中,不要使用太復(fù)雜的C表達(dá)式,因?yàn)楫?dāng)表達(dá)式太復(fù)雜時(shí),將需要更多的物理寄存器,這可能與指令中物理寄存器的使用相沖突。編譯器可以使用R1寄存器或R13寄存器來(lái)存儲(chǔ)編譯的中間結(jié)果,寄存器R0
3、R3、R2和R14可以用來(lái)在計(jì)算表達(dá)式值時(shí)調(diào)用子程序。因此,在嵌入式匯編指令中,不要同時(shí)將這些寄存器指定為指令中的物理寄存器。在嵌入式匯編指令中使用物理寄存器時(shí),如果C變量使用物理寄存器,編譯器將在適當(dāng)?shù)臅r(shí)候保存并恢復(fù)變量的值。應(yīng)當(dāng)注意,當(dāng)寄存器sp、sl、fp和sb用于特定目的時(shí),編譯器不能恢復(fù)這些寄存器的值。通常建議不要在嵌入式匯編指令中指定物理寄存器,因?yàn)檫@可能會(huì)影響編譯器的寄存器分配,從而影響代碼效率。1.3常量,在嵌入式匯編指令中,常量前的符號(hào)#可以省略。如果在表達(dá)式前使用#號(hào),則表達(dá)式必須是#號(hào)。1.4如果指令擴(kuò)展中嵌入的匯編指令包含常量操作數(shù),匯編程序可以將該指令擴(kuò)展成若干條指令
4、。例如,指令A(yù)DD R0、R0、#1023可以被擴(kuò)展成以下指令序列ADD R0、R0、#1024 SUB R0、R0、#01,并且乘法指令mul可以被擴(kuò)展成一系列加法運(yùn)算和移位運(yùn)算。事實(shí)上,除了與協(xié)處理器相關(guān)的指令,大多數(shù)ARM指令和Thumb指令都包含常量操作數(shù),這些操作數(shù)可以擴(kuò)展成多條指令。每個(gè)擴(kuò)展指令對(duì)CPSR寄存器中每個(gè)條件標(biāo)志位的影響如下:算術(shù)指令可以正確設(shè)置CPSR寄存器中的NZCV條件標(biāo)志位。邏輯指令可以在CPSR寄存器中正確地設(shè)置NZ條件標(biāo)志、非鏡像V條件標(biāo)志和破壞C條件標(biāo)志。1.5標(biāo)簽,該標(biāo)簽在c程序中可由嵌入式匯編指令使用。然而,在C程序中只有指令B可以使用標(biāo)簽,而指令BL
5、不能在C程序中使用標(biāo)簽。當(dāng)指令B使用C/C程序中的標(biāo)簽時(shí),語(yǔ)法格式如下:Bcond標(biāo)簽,1.6個(gè)內(nèi)存單元的分配,全部由C程序完成,分配的內(nèi)存單元由嵌入式匯編程序通過(guò)變量使用。嵌入式匯編程序不支持匯編語(yǔ)言中內(nèi)存分配的偽操作。1.7 SWI和BL指令的使用,在嵌入式SWI和BL指令中,除了正常的操作數(shù)字段外,還必須添加以下三個(gè)可選寄存器列表。第一個(gè)寄存器列表中的寄存器用于存儲(chǔ)輸入?yún)?shù)。第二個(gè)寄存器列表中的寄存器用于存儲(chǔ)返回的結(jié)果。第三寄存器列表中的寄存器內(nèi)容可能被被調(diào)用的子例程破壞,也就是說(shuō),這些寄存器被被調(diào)用的子例程用作工作寄存器。嵌入式匯編程序與armasm的區(qū)別與armasm相比,嵌入式匯編
6、程序在功能和用途上有以下特點(diǎn):使用嵌入式匯編程序不能通過(guò)寄存器PC返回當(dāng)前指令的地址。嵌入式匯編程序不支持偽指令“LDR Rn,表達(dá)式”,可以用指令“MOV Rn,表達(dá)式”代替。不支持帶標(biāo)簽的表達(dá)式。不支持藥品不良反應(yīng)和ADRL偽指令。前綴Ox應(yīng)該用于十六進(jìn)制計(jì)數(shù),但不能使用指令指令。如果一行中有許多匯編指令,請(qǐng)用分號(hào)“;”應(yīng)在說(shuō)明之間使用分離。如果一條指令占用多行,應(yīng)該使用連續(xù)符號(hào)“”。C語(yǔ)言的注釋語(yǔ)句可以在匯編語(yǔ)言中使用。在ARM C程序中,除了關(guān)鍵字asm可以用來(lái)識(shí)別匯編指令程序外,關(guān)鍵字asm也可以用來(lái)識(shí)別以下格式的匯編指令程序。指令”;其中,asm后面的括號(hào)必須是一個(gè)單獨(dú)的字符串;該
7、字符串不能包含注釋語(yǔ)句。3.2、在C程序中使用嵌入式匯編指令的注意事項(xiàng),在C程序中使用嵌入式匯編指令時(shí)應(yīng)注意以下事項(xiàng):在匯編指令中,逗號(hào) 用作分隔符。因此,如果指令中的c表達(dá)式包含逗號(hào)“,”,則表達(dá)式被括在括號(hào)中。例如:_asmADD x,y,(f(),z)其中(f(),z)是c表達(dá)式。如果指令中使用了物理寄存器,應(yīng)該保證在計(jì)算表達(dá)式值時(shí),該寄存器不會(huì)被編譯器破壞。例如,在下面的代碼段中,編譯器通過(guò)程序調(diào)用計(jì)算x/y的值。在此過(guò)程中,編譯器銷(xiāo)毀寄存器R2、R3、ip和lr的值,更新CPSR寄存器的NZCV條件標(biāo)志位,并返回寄存器R0中表達(dá)式的商和寄存器R1中表達(dá)式的余數(shù)。此時(shí),程序中寄存器R0
8、的數(shù)據(jù)丟失。-asm MOV R0,x ADD y,R0,x/y在這種情況下,c變量可用于替換第一條指令中的物理寄存器R0,即_asm MOV cvar,x ADD y,R0,x/y,編譯器將為變量cvar分配適當(dāng)?shù)募拇嫫饕员苊鉀_突。如果編譯器不能分配適當(dāng)?shù)募拇嫫?,它將?bào)告一個(gè)錯(cuò)誤。例如,在下面的代碼段中,因?yàn)榫幾g器將擴(kuò)展ADD指令,所以在擴(kuò)展時(shí)將使用ip寄存器,從而破壞第一條指令分配給ip寄存器的值,然后編譯器將報(bào)告錯(cuò)誤。_ ASM movoip,#3 ADDS x,x,#0 x12345678 ORR x,x,ip,不要使用物理寄存器來(lái)引用c變量。例如,在下面的例子中,用戶可能認(rèn)為參數(shù)x的
9、值在進(jìn)入子程序例1后存儲(chǔ)在寄存器R0中,所以寄存器R0直接用于嵌入式匯編指令,最后返回結(jié)果;事實(shí)上,編譯器認(rèn)為在子例程中沒(méi)有有意義的操作,所以它優(yōu)化了匯編代碼,使得返回的結(jié)果與輸入?yún)?shù)值相同,并且不加1。例如int x _ ASM addR0,R0,# 1/用戶可能會(huì)錯(cuò)誤地認(rèn)為變量x return x存儲(chǔ)在r0寄存器中。此代碼正確編寫(xiě)如下:int示例int x _ ASM add x,x,# 1返回x;對(duì)于嵌入式匯編程序可能使用的寄存器,編譯器本身會(huì)保存和恢復(fù)這些寄存器,用戶不需要保存和恢復(fù)這些寄存器。除了常量寄存器CPSR和寄存器SPSR之外,其他寄存器必須先分配后讀,否則編譯器會(huì)報(bào)告錯(cuò)誤。
10、例如,在以下示例中,第一條指令在賦值之前讀取寄存器R0的值,這是錯(cuò)誤的;最后一條指令也沒(méi)有必要恢復(fù)寄存器R0的值。int f(int x) _asm STMFD sp!R0 /在為寄存器R0賦值之前,讀取值addR0,x,1eorx,R0,xlmdfdsp!R0 /不需要恢復(fù)寄存器R0的返回值x;4從匯編程序中訪問(wèn)C程序變量,C程序中聲明的全局變量可以由匯編程序通過(guò)地址間接訪問(wèn)。具體的訪問(wèn)方法如下:用MPORT偽操作聲明全局變量。使用LDR指令讀取全局變量的內(nèi)存地址,該地址通常存儲(chǔ)在程序的字庫(kù)中。根據(jù)數(shù)據(jù)的類(lèi)型,使用相應(yīng)的LDR指令讀取全局變量的值;使用相應(yīng)的STR指令修改全局變量的值。每種數(shù)
11、據(jù)類(lèi)型及其對(duì)應(yīng)的LDR/STR指令如下:對(duì)于無(wú)符號(hào)字符型變量,通過(guò)指令LDRB/STRB進(jìn)行讀/寫(xiě)。對(duì)于短類(lèi)型的無(wú)符號(hào)變量,通過(guò)指令LDRBH/STRBH進(jìn)行讀/寫(xiě)。對(duì)于int類(lèi)型的變量,通過(guò)指令LDR/STR進(jìn)行讀/寫(xiě)。有符號(hào)字符類(lèi)型的變量由指令LDRSB讀取。對(duì)于無(wú)符號(hào)字符類(lèi)型的變量,它們由指令STRB編寫(xiě)。對(duì)于短類(lèi)型的有符號(hào)變量,通過(guò)指令LDRBH讀取它們。對(duì)于短類(lèi)型的有符號(hào)變量,它們由指令STRH編寫(xiě)。對(duì)于少于8個(gè)字的結(jié)構(gòu)變量,整個(gè)變量可以由一條LDM/短時(shí)記憶指令讀/寫(xiě)。對(duì)于結(jié)構(gòu)變量的數(shù)據(jù)成員,可以使用相應(yīng)的LDM/STR指令來(lái)訪問(wèn)它,此時(shí),必須指示數(shù)據(jù)成員相對(duì)于結(jié)構(gòu)變量起始地址的偏
12、移量。下面是一個(gè)用匯編程序訪問(wèn)C程序全局變量的例子。程序中的變量globv1是c程序中聲明的全局變量。首先,在匯編程序中使用IMPORT偽操作來(lái)聲明變量。然后將其存儲(chǔ)地址讀入寄存器R1;然后將其值讀入寄存器R0;修改后,寄存器R0的值分配給變量globv1。本例中的程序如下:區(qū)域全局、代碼、只讀導(dǎo)出、ASM子導(dǎo)入全局;用IMPORT偽指令將變量聲明為L(zhǎng)DRR1,# globv1將其存儲(chǔ)地址讀入寄存器R1 ldr0,R1;然后將其值讀入寄存器R0 ADD R0、R0、#2 STR R0,R1;修改后,寄存器R0的值被分配給變量globv1 MOV個(gè)人計(jì)算機(jī),LR END,5,匯編程序和c程序可以
13、互相調(diào)用。為了使單獨(dú)編譯的c程序和匯編程序能夠相互調(diào)用,必須為子程序之間的調(diào)用規(guī)則設(shè)置某些規(guī)則。ATPCS是ARM程序和Thumb程序中子程序調(diào)用的基本規(guī)則。ATPCS為子程序之間的調(diào)用指定了一些基本規(guī)則。這些基本規(guī)則包括寄存器的使用規(guī)則、數(shù)據(jù)堆棧的使用規(guī)則和子程序調(diào)用時(shí)參數(shù)的傳遞規(guī)則。為了滿足某些特定的需求,我們可以通過(guò)修改這些基本的調(diào)用規(guī)則來(lái)得到不同的子程序調(diào)用規(guī)則。這些特定的調(diào)用規(guī)則包括:支持?jǐn)?shù)據(jù)堆棧限制檢查的ATPCS。支持只讀段位置獨(dú)立的ATPCS(ROPI)。支持讀/寫(xiě)段位置無(wú)關(guān)(RWPI)的ATPCS。支持ARM程序和Thumb程序的混合使用。處理浮點(diǎn)運(yùn)算。所有具有調(diào)用關(guān)系的子程
14、序必須遵守相同的ATPCE。編譯器或匯編器在ELF格式的目標(biāo)文件中設(shè)置相應(yīng)的屬性,以識(shí)別用戶選擇的ATPCS類(lèi)型。對(duì)應(yīng)不同類(lèi)型的ATPACS規(guī)則有相應(yīng)的c語(yǔ)言庫(kù),連接器根據(jù)用戶指定的ATPACS類(lèi)型連接到相應(yīng)的c語(yǔ)言庫(kù)。用ADS的c語(yǔ)言編譯器編譯的c程序應(yīng)該滿足用戶指定的ATPCS的相似性。至于匯編語(yǔ)言,它完全依賴于用戶在編程時(shí)確保每個(gè)子程序滿足所選的ATPCS類(lèi)型。具體來(lái)說(shuō),匯編語(yǔ)言子程序必須滿足以下三個(gè)條件:編譯子程序時(shí),它們必須遵守相應(yīng)的ATPCS規(guī)則。堆棧的使用遵循相應(yīng)的ATPCS規(guī)則。在程序集編譯器中使用-atpcs選項(xiàng)?;続TPCS規(guī)定了調(diào)用子程序時(shí)的一些基本規(guī)則,包括以下三個(gè)方
15、面:每個(gè)寄存器的使用規(guī)則及其對(duì)應(yīng)的名稱(chēng)。數(shù)據(jù)堆棧的使用規(guī)則。參數(shù)傳遞規(guī)則。與其他類(lèi)型的ATPCS相比,滿足基本ATPCS的程序執(zhí)行速度更快,占用的內(nèi)存更少,但不能提供以下支持:ARM程序和Thumb程序相互調(diào)用。獨(dú)立于位置的數(shù)據(jù)和代碼支持。子程序的重入。支持?jǐn)?shù)據(jù)堆棧檢查。而其他幾個(gè)特定的可編程序控制器是在基本可編程序控制器的基礎(chǔ)上增加其他規(guī)則而形成的。其目的是提供上述功能。寄存器的使用規(guī)則通過(guò)寄存器R0R3在子程序之間傳遞參數(shù)。此時(shí),寄存器R0R3可以寫(xiě)為a0a3。被調(diào)用的子程序在返回前不需要恢復(fù)寄存器R0R3的內(nèi)容。在子程序中,寄存器R4R11用來(lái)保存局部變量。此時(shí),寄存器R4至r11可以表
16、示為v1至V8。如果子程序中使用了一些寄存器v1v8,子程序進(jìn)入時(shí)必須保存這些寄存器的值,并在返回前恢復(fù)。在Thumb程序中,只有寄存器R4R7可以用來(lái)保存局部變量。寄存器R12用作已被調(diào)用中間臨時(shí)寄存器,并被記錄為IP。這種用法規(guī)則經(jīng)常出現(xiàn)在子程序之間的連接代碼段中。寄存器R13用作堆棧指針,并記錄為SP。寄存器R13不能用于子程序中的其他目的。進(jìn)入子程序時(shí)寄存器SP的值和退出子程序時(shí)的值必須相等。寄存器R14被稱(chēng)為連接寄存器,并被表示為L(zhǎng)R。它用于保存子程序的返回地址。如果返回地址保存在子程序中,寄存器R14可用于其它目的。寄存器R15是一個(gè)程序計(jì)數(shù)器,被記錄為個(gè)人計(jì)算機(jī)。它不能用于其他目
17、的。(2)堆棧使用規(guī)則,ATPCS規(guī)定堆棧是FD類(lèi)型,即全遞減堆棧,并且對(duì)堆棧的操作是8字節(jié)對(duì)齊的。由編譯器在ADS中生成的目標(biāo)代碼包含DRAFT2格式的數(shù)據(jù)幀。在調(diào)試期間,調(diào)試器可以使用這些數(shù)據(jù)幀來(lái)查看堆棧中的相關(guān)信息。對(duì)于匯編語(yǔ)言,用戶必須使用FRAME偽指令來(lái)描述堆棧的數(shù)據(jù)幀。根據(jù)這些偽指令,ARM匯編程序在目標(biāo)文件中生成相應(yīng)的DRAFT2格式數(shù)據(jù)幀(在堆棧中,為保存寄存器和局部變量的子程序分配的區(qū)域)。對(duì)于匯編器,如果目標(biāo)文件包含外部調(diào)用,必須滿足以下條件:外部接口的堆棧必須是8字節(jié)對(duì)齊的。在匯編程序中使用PRESERVE8偽指令告訴連接器匯編程序數(shù)據(jù)是8字節(jié)對(duì)齊的。(3)參數(shù)傳遞規(guī)則,根據(jù)參數(shù)個(gè)數(shù)是否固定,子程序可以分為參數(shù)個(gè)數(shù)固定的子程序和參數(shù)個(gè)數(shù)可變的子程序。這兩個(gè)子例程的參數(shù)傳遞規(guī)則不同。對(duì)于參數(shù)數(shù)量可變的
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職電子技術(shù)(電子電路設(shè)計(jì))試題及答案
- 2025年大學(xué)舞蹈表演(舞蹈表演技能)試題及答案
- 2025年中職汽車(chē)運(yùn)用與維修(汽車(chē)美容)試題及答案
- 2025年中職(客戶服務(wù)實(shí)務(wù))客戶服務(wù)綜合測(cè)試試題及答案
- 2025年高職(旅游管理)導(dǎo)游服務(wù)技能階段測(cè)試題及答案
- 2025年大學(xué)建筑電氣與智能化(電氣工程理論)試題及答案
- 2025年中職(物聯(lián)網(wǎng)技術(shù)應(yīng)用)物聯(lián)網(wǎng)通信技術(shù)試題及答案
- 2025年高職新能源汽車(chē)運(yùn)營(yíng)應(yīng)用管理(管理技術(shù))試題及答案
- 2026年物業(yè)客服(客戶關(guān)系維護(hù))試題及答案
- 2025年中職農(nóng)資營(yíng)銷(xiāo)與服務(wù)(產(chǎn)品推廣)模擬試題
- 車(chē)間電纜整改方案模板(3篇)
- 徐州村務(wù)管理辦法
- 廣東省惠州市2026屆高三上學(xué)期第一次調(diào)研考試 歷史 含答案
- 政協(xié)機(jī)車(chē)輛管理辦法
- 食品加工助劑管理辦法
- DB50∕T 1604-2024 地質(zhì)災(zāi)害防治邊坡工程結(jié)構(gòu)可靠性設(shè)計(jì)規(guī)范
- 非現(xiàn)場(chǎng)執(zhí)法培訓(xùn)課件
- 中國(guó)電氣裝備資產(chǎn)管理有限公司招聘筆試題庫(kù)2025
- 糖尿病足的護(hù)理常規(guī)講課件
- 2025年高考英語(yǔ)復(fù)習(xí)難題速遞之語(yǔ)法填空(2025年4月)
- 2025外籍工作人員勞動(dòng)合同范本
評(píng)論
0/150
提交評(píng)論