版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第4章 ARM匯編語(yǔ)言編程 本章重點(diǎn)本章重點(diǎn) : ARM匯編器提供的匯編語(yǔ)言特性,包括行格式、預(yù)定義名和內(nèi)建變量、偽指令、符號(hào)、指示符和宏、表達(dá)式和操作符等,以及它們的使用; ARM匯編語(yǔ)言編程舉例。4.1 ARM匯編語(yǔ)言概述 本章講述的由ARM匯編器提供的匯編語(yǔ)言特性,如偽指令等,以及它們?cè)诰幊讨腥绾问褂谩V饕獌?nèi)容如下: 源代碼行格式、預(yù)定義的寄存器和協(xié)處理器名、內(nèi)建變量; ARM偽指令; Thumb偽指令; 符號(hào); 指示符和宏; 表達(dá)式和操作符。4.2 ARM匯編語(yǔ)言特性行格式、預(yù)定義名和內(nèi)建變量 行格式symbolinstruction|directive|pseudo_instruct
2、ion;comment也就是:符號(hào) 指令|指示符|偽指令 ;注釋 上述行格式中用大括號(hào)括起來(lái)的三部分是可選的。如果一行中沒(méi)有symbol,指令|指示符|偽指令不能從第1列位置開(kāi)始,指令|指示符|偽指令前面必須放置空格或Tab(制表符)字符。 每一條指令的助記符可以使用全部大寫(xiě)或全部小寫(xiě)字符,但不能在同一條指令的助記符中大、小寫(xiě)混用。指示符必須大寫(xiě)。指令中每一個(gè)寄存器名能夠全部大寫(xiě)或全部小寫(xiě),但不能大、小寫(xiě)混用。 行格式中symbol通常是標(biāo)號(hào)(label),在指令或偽指令前它總是標(biāo)號(hào),在某些指示符前它是表示變量或常量的符號(hào)(symbol)。 行格式中symbol必須從第一列開(kāi)始,不能含任何如空
3、格或Tab的字符,詳見(jiàn)本節(jié)符號(hào)命名規(guī)則部分。 預(yù)定義寄存器和協(xié)處理器名 預(yù)定義寄存器名 預(yù)定義程序狀態(tài)寄存器名 預(yù)定義浮點(diǎn)寄存器名 預(yù)定義協(xié)處理器名和協(xié)處理器寄存器名 內(nèi)建變量 內(nèi)建變量(built in variables)見(jiàn)表4.1,它們是由ARM匯編器定義過(guò)的。內(nèi)建變量不能用SETA、SETL或SETS指示符設(shè)置,它們能被用在表達(dá)式或條件中,如: IF ENDIAN=“big” 可用在ARM狀態(tài)的偽指令有: ADR、ADRL、LDFD、LDFS、LDR和NOP 偽指令。 ADR ARM偽指令 ADR偽指令裝入一個(gè)相對(duì)程序或相對(duì)寄存器的地址到一個(gè)寄存器。 格式 ADRcondition r
4、egister,expression 使用 使用中,ADR總是被匯編成一條指令。匯編器試圖產(chǎn)生一條ADD或SUB指令,裝入地址。如果不能用一條指令構(gòu)造出地址,則產(chǎn)生錯(cuò)誤信息,匯編失敗。 如果expression是相對(duì)程序的,計(jì)算產(chǎn)生的地址必須與ADR偽指令在同一個(gè)代碼區(qū)域。 使用舉例Test1 MOV r1,#0ADR r2,Test1 ;產(chǎn)生指令SUB r2,pc,#0 xC ADRL ARM偽指令 ADRL偽指令裝入一個(gè)相對(duì)程序或相對(duì)寄存器的地址到一個(gè)寄存器。與ADR偽指令功能相似,但ADRL比ADR能裝入更大的地址范圍,原因是ADRL產(chǎn)生兩條數(shù)據(jù)處理指令。 格式 ADRLconditio
5、n register,expression 使用 使用中,ADRL總是被匯編成2條指令。如果匯編器不能以2條指令構(gòu)造出地址,則產(chǎn)生錯(cuò)誤信息,匯編失敗。 如果expression是相對(duì)程序的,它必須計(jì)算產(chǎn)生一個(gè)與ADRL偽指令在同一個(gè)代碼區(qū)域的地址,否則在隨后的連接時(shí),地址可能出了范圍。 使用舉例start MOV r0,#10ADRL r4,start+60000 ;產(chǎn)生指令A(yù)DD r4,pc,#0 xe800 ; ADD r4,r4,#0 x254 LDFD和LDFS ARM偽指令 LDFD偽指令裝入一個(gè)雙精度浮點(diǎn)常數(shù)到指定的浮點(diǎn)寄存器。 LDFS偽指令裝入一個(gè)單精度浮點(diǎn)常數(shù)到指定的浮點(diǎn)寄存
6、器。 格式 LDFDcondition fp-register,=expression LDFScondition fp-register,=expression 使用 使用舉例 LDFD f2,=2.01E205 ;裝入2.01E205到f2 LDFS f0,=2.01E-5 ;裝入2.01E-5到f0 LDR ARM偽指令 LDR偽指令裝入一個(gè)32位常數(shù)值或一個(gè)地址到一個(gè)寄存器。 格式 LDRcondition register,=expression|label-expression 使用 使用LDR偽指令有兩個(gè)主要目的,一是當(dāng)一個(gè)立即數(shù)的值由于超了范圍,不能用MOV和MVN指令裝入到一
7、個(gè)寄存器時(shí),用LDR偽指令產(chǎn)生一個(gè)文字池常數(shù);二是裝入一個(gè)相對(duì)程序或外部的地址到一個(gè)寄存器。 使用舉例 LDR r0,=0 x1ff ;裝入0 x1ff到r0 LDR r1,=label ;裝入label地址到r1 NOP ARM偽指令 對(duì)NOP偽指令,匯編器產(chǎn)生什么也不操作的ARM指令:MOV r0,r0。 格式 NOP偽指令 ADR Thumb偽指令 ADR偽指令裝入一個(gè)相對(duì)程序或相對(duì)寄存器的地址到一個(gè)寄存器。 格式 ADR register,expression 使用 使用中,在Thumb狀態(tài),ADR只能產(chǎn)生字對(duì)齊的地址。要使用ALIGN指示符去確認(rèn)expression是字對(duì)齊的。 若表
8、達(dá)式是相對(duì)程序的,必須計(jì)算產(chǎn)生一個(gè)與ADR偽指令在同一個(gè)代碼區(qū)域的地址。 使用舉例 ADR r3,testexml ;產(chǎn)生指令A(yù)DD r3,pc,#nn ;code ALIGNtestexm1 DCW 1,2,3,4 LDR Thumb偽指令 LDR偽指令裝入一個(gè)32位常數(shù)值或一個(gè)地址到一個(gè)低寄存器中。 格式 LDR register,=expression|label-expression 使用 使用LDR偽指令有兩個(gè)主要目的,一是當(dāng)一個(gè)立即數(shù)的值由于超出MOV指令的范圍,不能裝入一個(gè)寄存器時(shí),產(chǎn)生文字池常數(shù);二是裝入一個(gè)相對(duì)程序或外部的地址到一個(gè)寄存器。 使用舉例 LDR r0,=0 x0
9、ffe ;裝入0 x0ffe到r0 LDR r1,=labeladdr ;裝入labeladdr地址到r1 MOV Thumb偽指令 MOV偽指令傳送一個(gè)低寄存器的值到另一個(gè)低寄存器(r0-r7)。而MOV指令不能傳送一個(gè)低寄存器的值到另一個(gè)低寄存器。 格式 MOV Rd,Rs 使用 在使用中,匯編器將MOV偽指令變成帶立即數(shù)的ADD指令,指令中立即數(shù)的值為0。 使用舉例 MOV Rd,Rs;產(chǎn)生指令A(yù)DD Rd,Rs,#0 NOP Thumb偽指令 對(duì)NOP偽指令,匯編器產(chǎn)生什么也不操作的Thumb指令:MOV r8,r8。 格式 NOP 使用符號(hào)能夠代表變量、地址和數(shù)值常數(shù)。符號(hào)代表地址時(shí)
10、,也稱(chēng)為標(biāo)號(hào)。 符號(hào)命名規(guī)則 符號(hào)命名遵守以下規(guī)則: 在符號(hào)名中可以使用大寫(xiě)字母、小寫(xiě)字母、數(shù)字字符或下劃線字符。 除了局部標(biāo)號(hào)外,不允許在符號(hào)名的第一個(gè)字符位置使用數(shù)字字符。 符號(hào)名中對(duì)大、小寫(xiě)字母是敏感的。 在符號(hào)名中所有的字符是有意義的。 在它們的作用范圍內(nèi),符號(hào)名必須是唯一的。 符號(hào)名必須不使用內(nèi)建變量名、預(yù)定義寄存器名和預(yù)定義協(xié)處理器名。 符號(hào)名應(yīng)該不使用與指令助記符或指示符相同的名字。 如果需要在符號(hào)名中使用更大范圍的字符,使用如下舉例的格式為符號(hào)名劃界線: |C$code| 其中兩邊的兩條豎線不是符號(hào)的一部分,只用于為符號(hào)名劃界線,它們之間不允許使用豎線、分號(hào)和換行符。 變量(v
11、ariables)變量有三種類(lèi)型: 數(shù)值 邏輯 串變量的類(lèi)型不能被改變,變量的值可以被改變。 匯編時(shí)串變量的替換 標(biāo)號(hào)(labels) 相對(duì)程序的標(biāo)號(hào) 相對(duì)寄存器的標(biāo)號(hào) 絕對(duì)地址 局部標(biāo)號(hào)(local labels) 局部標(biāo)號(hào)使用099范圍內(nèi)的一個(gè)數(shù),可以有選擇地在其后跟隨一個(gè)表示當(dāng)前范圍的名字。 局部標(biāo)號(hào)用在指令中,指出分支的目標(biāo)處。 局部標(biāo)號(hào)格式為: nroutname 常量 常量由數(shù)值常量、串常量、布爾常量和字符常量組成。 數(shù)值常量 數(shù)值常量在匯編語(yǔ)言中采用以下三種形式: 十進(jìn)制數(shù),例如234; 十六進(jìn)制數(shù),例如0 x7b或0 x7B; n進(jìn)制數(shù),格式為n_xxx,n是29之間的一個(gè)基數(shù)
12、,xxx是這個(gè)基數(shù)下的數(shù)值,例如8_375,表示基數(shù)為8(八進(jìn)制數(shù)),數(shù)值為375。 串常量 布爾常量 字符常量使用舉例:anum SETA 3500 ;假定anum在以前聲明過(guò)addr DCD 0 x00ff ;十六進(jìn)制數(shù) DCD 0 x00FF ;十六進(jìn)制數(shù) DCD 2_11000011 ;二進(jìn)制數(shù)bnum SETA 8_74007 ;假定bnum在以前聲明過(guò),八進(jìn)制數(shù) LDR r1,=A ;字符匯編器提供指示符用來(lái)支持: 定義數(shù)據(jù)結(jié)構(gòu)和為數(shù)據(jù)分配空間; 文件分隔成邏輯上的一個(gè)或多個(gè)區(qū)域; 錯(cuò)誤報(bào)告和匯編列表控制; 符號(hào)定義; 條件匯編和重復(fù)匯編,以及在一個(gè)文件中包含輔助文件。 定義區(qū)域的
13、AREA指示符 AREA指示符通知匯編器,匯編一個(gè)新的代碼或數(shù)據(jù)區(qū)域。區(qū)域是能被連接器(linker)處理的、獨(dú)立的、命名的、不可分的代碼或數(shù)據(jù)塊。 格式 AREA name,attr ,attr 使用 一個(gè)匯編程序必須最少有一個(gè)AREA指示符。 當(dāng)程序比較大時(shí),可以將代碼和數(shù)據(jù)用不同的名字分為多個(gè)區(qū)域。 使用舉例 如下例子定義了一個(gè)只讀,稱(chēng)為T(mén)est的代碼區(qū)域。 AREA Test,CODE,READONLY ;代碼區(qū)域,名為T(mén)est ;code 用于選擇指令集的CODE16和CODE32指示符 格式格式分別是: CODE16 CODE32 使用 在ARM狀態(tài)當(dāng)使用BX指令分支到Thumb指
14、令時(shí),使用CODE16。CODE16放置在分支目標(biāo)處代碼的前面。當(dāng)從Thumb狀態(tài)分支到ARM指令時(shí),使用CODE32。CODE32放置在分支目標(biāo)處代碼的前面。 使用舉例 使用舉例1:這個(gè)例子給出如何從ARM指令分支到Thumb指令。 AREA ARMtoThumb,CODE,READONLY ;這個(gè)區(qū)域開(kāi)始于ARM狀態(tài) ADR r1,test1+1 ;裝入地址,設(shè)置最低位為1 BX r1 ;分支并且改變指令集 CODE16 ;跟隨指令為 Thumb指令test1 MOV r0,#20 ;Thumb指令 源程序結(jié)束的END指示符 END指示符告訴匯編器,已經(jīng)匯編到源文件結(jié)束處。 格式 END
15、使用 使用時(shí),每個(gè)匯編語(yǔ)言源文件必須以END指示符結(jié)束。 使用舉例 AREA Init,CODE,READONLY END 聲明匯編程序入口點(diǎn)的ENTRY指示符 ENTRY指示符聲明一個(gè)程序的入口點(diǎn)。 格式 ENTRY 使用 使用時(shí),必須為一個(gè)程序指定一個(gè)且只有一個(gè)ENTRY指示符。如果不存在ENTRY或存在一個(gè)以上ENTRY,連接時(shí)產(chǎn)生錯(cuò)誤信息。如果在一個(gè)單一的源文件中存在多個(gè)ENTRY,匯編時(shí)產(chǎn)生錯(cuò)誤信息。 使用舉例 AREA Init,CODE,READONLY ENTRY ;程序入口點(diǎn) 禁止浮點(diǎn)運(yùn)算的NOFP指示符 NOFP指示符表明在一個(gè)匯編語(yǔ)言源文件中不接受浮點(diǎn)指令。 格式 NOF
16、P 使用 使用NOFP指示符確認(rèn)在軟件或目標(biāo)硬件不支持浮點(diǎn)指令的情況下,程序中沒(méi)有使用浮點(diǎn)指令。 定義局部標(biāo)號(hào)使用范圍的ROUT指示符 ROUT指示符標(biāo)記局部標(biāo)號(hào)使用范圍的界線。 格式 name ROUT 使用 在使用中,ROUT指示符限制了局部標(biāo)號(hào)的使用范圍。這使得程序員容易避免偶然引用一個(gè)錯(cuò)誤的標(biāo)號(hào)這種情況的發(fā)生。如果不存在ROUT指示符,局部標(biāo)號(hào)的使用范圍是整個(gè)AOF區(qū)域。如果存在ROUT指示符,局部標(biāo)號(hào)的使用范圍在兩個(gè)ROUT之間。 使用name選項(xiàng)用于保證每次引用正確的標(biāo)號(hào)。如果標(biāo)號(hào)名或引用標(biāo)號(hào)名與ROUT指示符前面的名字不匹配,匯編器產(chǎn)生錯(cuò)誤信息,匯編失敗。使用舉例(見(jiàn)參考書(shū)P12
17、9) 在代碼中使用數(shù)據(jù)的DATA指示符 DATA指示符通知匯編器,這個(gè)標(biāo)號(hào)是在代碼中的數(shù)據(jù)標(biāo)號(hào),這意味著標(biāo)號(hào)是在代碼段中的數(shù)據(jù)的地址。 格式 label DATA 使用 使用時(shí),如果需要在Thumb代碼區(qū)域用到某一個(gè)數(shù)據(jù)定義指示符,如DCD、DCB和DCW,定義數(shù)據(jù)時(shí),必須使用DATA指示符。 使用舉例 AREA test,CODEThumb_Code ;code ;code MOV pc,lr Thumb_Data DATA DCB 2,5,8 分配存儲(chǔ)器字節(jié)的DCB指示符 DCB也可以用 = 指示符代替。 DCB指示符分配一個(gè)或多個(gè)存儲(chǔ)器中的字節(jié),并且定義初始運(yùn)行時(shí)的存儲(chǔ)器內(nèi)容。 格式 l
18、abel DCB expression ,expression 使用 如果需要在Thumb代碼中用DCB定義帶標(biāo)號(hào)的數(shù)據(jù),必須使用DATA指示符。 如果DCB后跟隨著指令,應(yīng)該使用ALIGN指示符去確認(rèn)指令存放是邊界對(duì)齊的。 使用舉例(見(jiàn)參考書(shū)P131) 分配存儲(chǔ)器半字的DCW和DCWU指示符 DCW指示符分配一個(gè)或多個(gè)存儲(chǔ)器中的半字,以2字節(jié)邊界對(duì)齊,定義初始運(yùn)行時(shí)的存儲(chǔ)器內(nèi)容。 DCWU與DCW的區(qū)別是:DCWU不要求以2字節(jié)邊界對(duì)齊。 格式格式分別是: label DCW expression,expression label DCWU expression,expression 使用
19、使用時(shí),如果需要在Thumb代碼中用DCW(DCWU)定義一個(gè)帶標(biāo)號(hào)的數(shù)據(jù),必須使用DATA指示符。 如果DCW(DCWU)后跟隨著指令,要使用ALIGN指示符,確認(rèn)指令是字邊界對(duì)齊的。 使用舉例(見(jiàn)參考書(shū)P132) 分配存儲(chǔ)器字的DCD和DCDU指示符 DCD也可以用 & 指示符代替。 DCD指示符分配1個(gè)或多個(gè)存儲(chǔ)器中的字,4字節(jié)邊界對(duì)齊,并且定義初始運(yùn)行時(shí)的存儲(chǔ)器內(nèi)容。 DCDU與DCD的區(qū)別是:DCDU不要求4字節(jié)邊界對(duì)齊。 格式格式分別是: label DCD expression,expression label DCDU expression,expression 使用
20、使用時(shí),如果需要在Thumb代碼中用DCD(DCDU)定義一個(gè)帶標(biāo)號(hào)的數(shù)據(jù),必須使用DATA指示符。 如果DCDU后面跟隨著代碼,需要使用ALIGN指示符,確認(rèn)指令是字邊界對(duì)齊的。 為了獲得4字節(jié)邊界對(duì)齊,如果需要,DCD指示符在第1個(gè)定義的字前,會(huì)插入最多3字節(jié)作為填充字節(jié)。 DCDU不插入填充字節(jié)。 使用舉例(見(jiàn)參考書(shū)P133) 為單精度浮點(diǎn)數(shù)分配存儲(chǔ)器的DCFS和DCFSU指示符 (見(jiàn)參考書(shū)P133) 為雙精度浮點(diǎn)數(shù)分配存儲(chǔ)器的DCFD和DCFDU指示符 (見(jiàn)參考書(shū)P134) 分配數(shù)據(jù)區(qū)并使其初值為0的SPACE指示符 SPACE也可以用 % 指示符代替。 % 指示符保留存儲(chǔ)器的一塊內(nèi)容
21、設(shè)置為0的數(shù)據(jù)區(qū)。 格式 label % numeric-expression 使用 使用中,如果用 % 定義了標(biāo)號(hào)的數(shù)據(jù)在Thumb代碼中,必須使用DATA指示符。 可以使用ALIGN指示符去對(duì)齊跟在 % 指示符后的代碼的存放地址。 使用舉例 AREA TestData,DATA,READWRITEdata1 % 127 ;分配127字節(jié)內(nèi)容為0的存儲(chǔ)區(qū) 邊界對(duì)齊的ALIGN指示符 用ALIGN指示符在代碼中對(duì)齊當(dāng)前的位置到確定的邊界。 格式 ALIGN expression,offset-expression 使用 在使用中,用ALIGN去確認(rèn)代碼地址被正確地對(duì)齊。 當(dāng)需要時(shí),可以使用AL
22、IGN去確認(rèn)Thumb代碼地址按字對(duì)齊。例如,ADR Thumb偽指令只能裝入字對(duì)齊的地址。 使用舉例(見(jiàn)參考書(shū)P135) 聲明文字池的LTORG指示符 LTORG指示符通知匯編器,立即匯編當(dāng)前的文字池。 格式 LTORG 使用 由AREA指示符定義開(kāi)始的每個(gè)區(qū)域,在代碼區(qū)域結(jié)尾處或匯編結(jié)尾處,即使不寫(xiě)出LTORG,匯編器也執(zhí)行LTORG指示符。 使用LTORG確認(rèn)在LDR、LDFD和LDFS偽指令范圍內(nèi),文字池被匯編。大一些的程序可能要求幾個(gè)文字池。 放LTORG指示符應(yīng)該在無(wú)條件分支或子程序返回指令之后,使得處理器不會(huì)試圖把常數(shù)當(dāng)作指令去執(zhí)行。 在文字池中,匯編器以字邊界對(duì)齊數(shù)據(jù)。 使用舉
23、例(見(jiàn)參考書(shū)P136) 定義結(jié)構(gòu)化內(nèi)存表的MAP和FIELD指示符 MAP也可以用 指示符代替。 FIELD也可以用 # 指示符代替。 MAP和FIELD指示符用于描述結(jié)構(gòu)化內(nèi)存表。MAP指示符 MAP指示符設(shè)置結(jié)構(gòu)化內(nèi)存表首地址在指定位置。結(jié)構(gòu)化內(nèi)存表定位計(jì)數(shù)器用表示,被設(shè)置成相同地址。 格式 MAP expression,base-register 使用 MAP指示符可以多次使用,定義多個(gè)結(jié)構(gòu)化內(nèi)存表。 計(jì)數(shù)器在第一個(gè)MAP指示符被使用前設(shè)置為0。 使用舉例(見(jiàn)參考書(shū)P137)FIELD指示符 FIELD指示符描述已經(jīng)由MAP定義的結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。 格式 label FIELD e
24、xpression 使用 使用 指示符與 # 指示符的組合來(lái)描述結(jié)構(gòu)化內(nèi)存表。 使用舉例(見(jiàn)參考書(shū)P137) 聲明并初始化全局變量的GBLA、GBLL和GBLS指示符 GBLA指示符聲明并初始化一個(gè)全局算術(shù)變量,取值范圍與數(shù)值表達(dá)式相同。 GBLL指示符聲明并初始化一個(gè)全局邏輯變量,取值范圍為T(mén)RUE或FALSE。 GBLS指示符聲明并初始化一個(gè)全局串變量,取值范圍與串表達(dá)式相同。 格式 格式分別是: GBLA variable-name GBLL variable-name GBLS variable-name 使用 使用舉例(見(jiàn)參考書(shū)P139) 聲明并初始化局部變量的LCLA、LCLL和L
25、CLS指示符 局部變量?jī)H僅能在一個(gè)宏內(nèi)聲明。 LCLA指示符聲明并初始化一個(gè)局部算術(shù)變量,取值范圍與數(shù)值表達(dá)式相同。 LCLL指示符聲明并初始化一個(gè)局部邏輯變量,取值范圍為T(mén)RUE或FALSE。 LCLS指示符聲明并初始化一個(gè)局部串變量,取值范圍與串表達(dá)式相同。 格式 格式分別是: LCLA variable-name LCLL variable-name LCLS variable-name 使用 使用舉例(見(jiàn)參考書(shū)P140) 設(shè)置變量值的SETA、SETL和SETS指示符 SETA指示符設(shè)置局部或全局算術(shù)變量的值。 SETL指示符設(shè)置局部或全局邏輯變量的值。 SETS指示符設(shè)置局部或全局串
26、變量的值。 格式 格式分別是: variable-name SETA expression variable-name SETL expression variable-name SETS expression 使用 使用SETA、SETL和SETS之前,必須先聲明全局變量或局部變量,后設(shè)置它們的值。 使用舉例(見(jiàn)參考書(shū)P141) 為協(xié)處理器寄存器定義一個(gè)名字的CN指示符 為指定的協(xié)處理器定義一個(gè)名字的CP指示符 (具體內(nèi)容見(jiàn)參考書(shū)P141) 給符號(hào)名一個(gè)數(shù)值常數(shù)的EQU指示符 EQU也可以用 * 指示符代替。 格式 name EQU expression 使用 使用EQU來(lái)定義常數(shù),與C語(yǔ)言
27、中#define類(lèi)似。 使用舉例num2 EQU 25 ;給符號(hào)num2指定值為25 聲明全局符號(hào)的EXPORT或GLOBAL指示符 GLOBAL與EXPORT有相同的功能。 格式 EXPORT symbol qualifier,qualifier,qualifier 使用 使用EXPORT指示符,允許別的文件中的代碼引用當(dāng)前文件中的符號(hào)。 使用舉例 AREA TestSub,CODE,READONLY EXPORT DoSub ;函數(shù)名能被外部模塊使用 DoSub SUB r1,r2,r1 為指定的浮點(diǎn)寄存器定義一個(gè)名字的FN指示符 聲明其他文件定義的符號(hào)的IMPORT或EXTERN指示符
28、保留局部符號(hào)的KEEP指示符 定義寄存器列表名的RLIST指示符 定義寄存器名的RN指示符 (具體內(nèi)容見(jiàn)參考書(shū)P142-145) 條件匯編IF、ELSE和ENDIF指示符 IF指示符可以用 代替;ELSE指示符可以用 | 代替;ENDIF指示符可以用 代替。 IF指示符引入一個(gè)條件,由這個(gè)條件決定是否匯編指令和或指示符代碼1。 ELSE指示符標(biāo)記指令和或指示符代碼2的開(kāi)始,當(dāng)IF后的條件為假,則匯編指令和或指示符代碼2。 ENDIF指示符標(biāo)記條件匯編結(jié)束。 格式 IF logical-expression 指令和或指示符代碼1 ELSE 指令和或指示符代碼2 ENDIF 使用 匯編器根據(jù)條件決
29、定是否匯編某一段代碼 使用舉例 GBLL Test ;聲明一個(gè)全局邏輯變量 Test=TRUE;IF ;指令和或指示符代碼1 | ;ELSE ;指令和或指示符代碼2 ;ENDIF。 重復(fù)匯編WHILE和WEND指示符 WHILE指示符測(cè)試一個(gè)條件,由這個(gè)條件決定是否匯編指令和或指示符代碼。 WEND指示符表示指令和或指示符代碼結(jié)束,由WHILE再次測(cè)試條件,決定是否重復(fù)進(jìn)行匯編,直到條件不成立。 格式 WHILE logical-expression 指令和或指示符代碼 WEND 使用 在使用中,WHILE和WEND配對(duì)使用,對(duì)指令和或指示符代碼重復(fù)匯編。重復(fù)次數(shù)可以是0。 在WHILEWEN
30、D內(nèi)可以使用IFENDIF。WHILEWEND能被嵌套使用。 使用舉例 GBLA count count SETA 3 WHILE count = 5 count SETA count+1 ;指令和或指示符代碼;重復(fù)匯編3次 WEND 宏定義MACRO、MEND和退出宏MEXIT指示符 MACRO指示符標(biāo)記一個(gè)宏定義的開(kāi)始; MEND指示符標(biāo)記這個(gè)宏定義的結(jié)束; 而MEXIT指示符通知匯編器,從宏中退出。MACRO和MEND指示符 格式 MACRO macro-prototype ;code MEND 在MACRO指示符后,下一行必須跟著宏原型(macro-prototype)語(yǔ)句。 宏原型語(yǔ)
31、句格式是: $label macroname $parameter1,$parameter2 使用 使用時(shí),在宏的內(nèi)部,像$label、$parameter這些參數(shù),能夠像其他的變量那樣,以同樣的方法被使用。每次宏調(diào)用(macro invocation)時(shí),都要給它們一個(gè)新的值。參數(shù)必須使用$,用來(lái)與其他符號(hào)區(qū)別。 $label是可選參數(shù)。如果宏內(nèi)定義一個(gè)內(nèi)部標(biāo)號(hào),$label是有用的。它被看作宏的一個(gè)參數(shù)。 如果使用符號(hào) | 作為變量,用于表示一個(gè)參數(shù)的缺省值。如果變量被省略,用空串替換。 如果一個(gè)參數(shù)后面緊跟著文本或另一個(gè)參數(shù),在擴(kuò)展時(shí)它們之間無(wú)空格時(shí),用“.”放在它們中間。如果前面是文本
32、后面是參數(shù),不能使用“.”。 宏定義了局部變量的使用范圍。 宏能夠被嵌套。 使用舉例(見(jiàn)參考書(shū)P147-148) MEXIT指示符 MEXIT用于在宏定義結(jié)束前退出。 格式 MEXIT 使用 在匯編期間,當(dāng)需要從一個(gè)宏中退出時(shí),使用MEXIT指示符。 使用舉例(見(jiàn)參考書(shū)P148) 包含文件的INCLUDE和INCBIN指示符(見(jiàn)參考書(shū)P148-149)報(bào)告指示符 報(bào)告指示符的共同之處是使用它們能夠產(chǎn)生一些報(bào)告信息。報(bào)告指示符包括: ASSERT、INFO、OPT、SUBT和TTL指示符。 表4.7 報(bào)告指示符指示符指示符描描 述述使使 用用 舉舉 例例解解 釋釋ASSERT斷言斷言ASSERT
33、 label1= 等,使用無(wú)符號(hào)數(shù)的解釋?zhuān)虼?-1結(jié)果為FALSE。 相對(duì)寄存器和相對(duì)程序的表達(dá)式 一個(gè)相對(duì)寄存器的表達(dá)式計(jì)算產(chǎn)生指定寄存器加或減一個(gè)數(shù)值常數(shù)。 一個(gè)相對(duì)程序的表達(dá)式計(jì)算產(chǎn)生程序計(jì)數(shù)器(pc)加或減一個(gè)數(shù)值常數(shù)。 邏輯表達(dá)式 邏輯表達(dá)式由邏輯常量(TRUE或FALSE)、邏輯變量、布爾操作符、關(guān)系和括號(hào)的組合組成。 關(guān)系由變量、文字、常量或使用適當(dāng)操作符的表達(dá)式結(jié)合在一起組成。 一元操作符(unary operators) 一元操作符(也稱(chēng)單目運(yùn)算符)有最高優(yōu)先級(jí)并且首先被計(jì)算。一元操作符位于它的操作數(shù)前面,多個(gè)相鄰的操作符從右到左計(jì)算。 一元操作符見(jiàn)表4.9。(P153)
34、二元操作符(binary operators) 二元操作符(也稱(chēng)雙目運(yùn)算符)被寫(xiě)在一對(duì)它們要進(jìn)行操作的子表達(dá)式之間。相同優(yōu)先級(jí)的操作符從左到右計(jì)算。 表4.10中將二元操作符按優(yōu)先級(jí)不同分為6組,1組優(yōu)先級(jí)最高,組內(nèi)*、MOD有相同的優(yōu)先級(jí);6組優(yōu)先級(jí)最低。(P154)4.3 ARM匯編語(yǔ)言編程舉例 匯編語(yǔ)言 匯編器 (詳細(xì)內(nèi)容見(jiàn)參考書(shū)P155-156)【例4.1】 匯編語(yǔ)言模塊舉例。 AREA example,CODE,READONLY;命名代碼塊為命名代碼塊為example ENTRY;標(biāo)記第一條要執(zhí)行的指令標(biāo)記第一條要執(zhí)行的指令run1 MOV r1,#20;設(shè)置參數(shù)設(shè)置參數(shù) MOV r
35、2,#15 SUB r1,r1,r2;r1=r1-r2;代碼代碼 MOV r0,#0 x18;傳送到軟件中斷的參數(shù)傳送到軟件中斷的參數(shù) LDR r1,=0 x20026;傳送到軟件中斷的參數(shù)傳送到軟件中斷的參數(shù) SWI 0 x123456;通過(guò)軟件中斷指令返回通過(guò)軟件中斷指令返回 END;標(biāo)記文件結(jié)束標(biāo)記文件結(jié)束【例4.2】 子程序調(diào)用。 AREA addsubrout,CODE,READONLY;命名代碼塊命名代碼塊 ENTRY;標(biāo)記執(zhí)行的第一條指令標(biāo)記執(zhí)行的第一條指令run1 MOV r0,#101;建立參數(shù)建立參數(shù) MOV r1,#321 MOV r2,#43 MOV r3,#55 BL addfun;調(diào)用子程序調(diào)用子程序 MOV r0,#0 x18 LDR
溫馨提示
- 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年食堂承包經(jīng)營(yíng)員工勞動(dòng)權(quán)益保障協(xié)議3篇
- 2025年食堂蔬菜糧油智能化管理系統(tǒng)合作協(xié)議3篇
- 2025年度個(gè)人房產(chǎn)托管服務(wù)合同范本4篇
- 2025版高科技園區(qū)門(mén)衛(wèi)值班人員崗位聘用合同協(xié)議4篇
- 2025年度個(gè)人虛擬現(xiàn)實(shí)體驗(yàn)服務(wù)合同范本4篇
- 物業(yè)服務(wù)公司2025年度合同管理制度解讀6篇
- 個(gè)體損害和解合同格式(2024年版)版B版
- 2025年度生態(tài)園林蟲(chóng)害生物防治技術(shù)合同范本3篇
- 2025年度數(shù)碼產(chǎn)品代銷(xiāo)合同范本
- 2025年食堂食堂食材采購(gòu)及加工配送協(xié)議3篇
- 割接方案的要點(diǎn)、難點(diǎn)及采取的相應(yīng)措施
- 2025年副護(hù)士長(zhǎng)競(jìng)聘演講稿(3篇)
- 2024年08月北京中信銀行北京分行社會(huì)招考(826)筆試歷年參考題庫(kù)附帶答案詳解
- 原發(fā)性腎病綜合征護(hù)理
- 2024年高考英語(yǔ)復(fù)習(xí)(新高考專(zhuān)用)完形填空之詞匯復(fù)現(xiàn)
- 【京東物流配送模式探析及發(fā)展對(duì)策探究開(kāi)題報(bào)告文獻(xiàn)綜述4100字】
- 施工現(xiàn)場(chǎng)工程令
- 藥物經(jīng)濟(jì)學(xué)評(píng)價(jià)模型構(gòu)建
- Daniel-Defoe-Robinson-Crusoe-笛福和魯濱遜漂流記全英文PPT
- 第一章威爾遜公共行政管理理論
- 外科護(hù)理(高職護(hù)理專(zhuān)業(yè))PPT完整全套教學(xué)課件
評(píng)論
0/150
提交評(píng)論