ARM匯編書(shū)寫(xiě)格式及符號(symbol)和表達式(expr)
{symbol}{instruction/directive/pseud0-instruction}{;comment}
本文引用地址:http://dyxdggzs.com/article/201611/319058.htmsymbol:標號/局部標號/常量/變量
instruction:指令
directive:偽操作
pseudo-instruction:偽指令
comment:注釋
{}中括號內是可選
注意:
1.symbol必須頂格書(shū)寫(xiě)。(ARM匯編其后不加“:”)(GUN匯編要加“:”)
2.symbol命名規則:由字母,數字,下劃線(xiàn)組成;除局部標號外,不能以數字開(kāi)頭。
3.指令不能頂格書(shū)寫(xiě)。
4.ARM指令,偽指令,偽操作,寄存器名可以全部為大寫(xiě)字母,也可全部為小寫(xiě)字母;不可大小寫(xiě)混用。
5.如果語(yǔ)句太長(cháng),可以將一條語(yǔ)句分幾行來(lái)書(shū)寫(xiě),在行末用“”表示換行(即下一行與本行為同一語(yǔ)句)。“”后不能有任何字符,包含空格和制表符(Tab)。
ARM匯編語(yǔ)言中的符號
symbol(標號)
本質(zhì):代表一個(gè)地址值。段內標號的地址值在匯編時(shí)確定;段外標號的地址值在連接時(shí)確定。
分類(lèi):3類(lèi)(分類(lèi)依據了 標號的生成方式)
symbol(局部標號)
局部標號主要在局部范圍內使用。它由兩部組成:開(kāi)頭是一個(gè)0-99直接的數字,后面緊接一個(gè)通常表示該局部變量作用范圍的符號。
局部變量的作用范圍通常為當前段,也可以用ROUT來(lái)定義局部變量的作用范圍。
局部變量定義的語(yǔ)法格式:N{routname}
N:為0~99之間的數字。
routname:當前局部范圍的名稱(chēng)(為符號),通常為該變量作用范圍的名稱(chēng)(用ROUT偽操作定義的)。
局部變量引用的語(yǔ)法格式:%{F|B}{A|T}N{routname}
%:表示引用操作
N:為局部變量的數字號。
routname 為當前作用范圍的名稱(chēng)(用ROUT偽操作定義的)
%:表示引用操作
F:指示編譯器只向前搜索
B:指示編譯器只向后搜索
A:指示編譯器搜索宏的所有嵌套層次
T:指示編譯器搜索宏的當前層次
注意:1.如果F和B都沒(méi)有指定,編譯器先向前搜索,再向后搜索
symbol(常量)
注意:1.匯編器對-n和2^32-1不做區別;匯編時(shí)對關(guān)系運算符采用無(wú)符號數方式處理,這就意味著(zhù)當0>-1是
symbol(變量)
注意:匯編時(shí)變量的替換
通常情況下,包含在兩個(gè)豎線(xiàn)(|)之間的$并不表示進(jìn)行變量替換。但是如果豎線(xiàn)(|)是在雙引號內,則將進(jìn)行變量替換。
ARM匯編語(yǔ)言中的表達式
表達式是由符號、數值、單目或多目操作符以及括號組成的。
1、字符串表達式
字符串表達式由字符串、字符串變量、操作符以及括號組成。字符串的最大長(cháng)度為512字節,最小長(cháng)度為0.下面介紹字符串表達式的組成元素。
字符串:由包含在雙引號內的一系列的字符組成。字符串的長(cháng)度受到ARM匯編語(yǔ)言語(yǔ)句長(cháng)度的限制。當在字符串中包含美元符號$或者引號"時(shí),用$$表示一個(gè)$,用""表示一個(gè)"。
字符串變量:用偽操作GBLS或者LCLS聲明,用SETS賦值。
操作符:
(1)LEN:返回字符串的長(cháng)度
:LEN:A
其中,A為字符串變量
(2)CHR:可以將0~255之間的整數作為含一個(gè)ASCII字符的字符串。當有些ASCII字符不方便放在字符串中時(shí),可以使用CHR將其放在字符串表達式中。
:CHR:A
其中,A為某一字符的ASCII值
(3)STR:將一個(gè)數字量或者邏輯表達式轉換成串。對于32位的數字量而言,STR將其轉換成8個(gè)十六進(jìn)制數組成的串;對于邏輯表達式而言,STR將其轉換成字符串T或者F
:STR:A
其中,A為數字量或者邏輯表達式
(4)LEFT:返回一個(gè)字符串最左端一定長(cháng)度的子串
A:LEFT:B
其中,A為源字符串,B為數字量,表示LEFT將返回的字符個(gè)數
(5)RIGHT:返回一個(gè)字符串最右端一定長(cháng)度的子串
A:RIGHT:B
其中,A為源字符串,B為數字量,表示RIGHT將返回的字符個(gè)數
(6)CC:用于連接兩個(gè)字符串。
A:CC:B
其中,A為第1個(gè)源字符串。B為第2個(gè)源字符串。CC操作符將字符串B連接在字符串A的后面。
2、數字表達式
數字表達式由數字常量、數字變量、操作符和括號組成
數字變量用偽操作GBLA或者LCLA聲明,用SETA賦值,它代表一個(gè)32位的數字量。
操作符:
(1)NOT:按位取反
:NOT:A
其中,A為一個(gè)32位數字量
(2)+、—、×、/及MOD算術(shù)操作符
A+B,A-B,A×B,A/B
A:MOD:B表示A除以B的余數
(3)ROL,ROR,SHL,SHR移位
A:ROL:B將整數A循環(huán)左移B位
A:SHL:B將整數A左移B位
(4)AND、OR及EOR按位邏輯操作符
A:AND:B將數字表達式A和B按位作邏輯與操作
3、基于寄存器和基于PC的表達式
基于寄存器的表達式表示了某個(gè)寄存器的值加上(或者減去)一個(gè)數字表達式
基于PC的表達式表示了PC寄存器的值加上(或減去)一個(gè)數字表達式?;赑C的表達式通常由程序中的標號與一個(gè)數字表達式組成。相關(guān)的操作符:
(1)BASE:返回基于寄存器的表達式中的寄存器編號。
:BASE:A
(2)INDEX:返回基于寄存器的表達式相對于其基址寄存器的偏移量。
:INDEX:A
(3)+、﹣:正負號,可以放在數字表達式或者基于PC的表達式前面。
+A(﹣A)
4、邏輯表達式
由邏輯量、邏輯操作符、關(guān)系操作符以及括號組成,取值范圍為{FLASE}和{TRUE}
關(guān)系操作符:用于表示兩個(gè)同類(lèi)表達式之間的關(guān)系。關(guān)系操作符和它的兩個(gè)操作數組成一個(gè)邏輯表達式,其取值為{FALSE}或{TRUE}
如A=B 表示A等于B
A/=B,A<>B表示A不等于B
邏輯操作符:進(jìn)行兩個(gè)邏輯表達式之間的基本邏輯操作。操作的結果為{FLASE}或{TRUE}
:LNOT:A 邏輯表達式A的值取反
A:LAND:B邏輯表達式A和B邏輯與
5、其他的一些操作符
(1)?:返回定義符號A的代碼行所生成的可執行代碼的字節數
?A
其中,A為一個(gè)符號
(2)DEF:判斷某個(gè)符號是否已定義
:DEF:A
如果符號A已經(jīng)定義,上述結果為{TRUE},否則為{FLASE}
(3)SB_OFFSET_19_12
:SB_OFFSET_19_12:label 其中,label為一個(gè)標號
返回(label-SB)的bits[19:12]
(4)SB_OFFSET_11_0
:SB_OFFSET_11_0:label
返回(label-SB)的bits[11:0]
參考文章
1. http://hi.baidu.com/%CF%EB%B7%C9%B5%C4%B4%FC%CA%F3/blog/item/ba6e93cb867a9e17be09e68e
2. ARM嵌入式系統結構與編程.邱鐵。清華大學(xué)出版社
3. ARM嵌入式系統入門(mén).三恒星科技.中國電力出版社
4. ARM嵌入式應用技術(shù)基礎.劉凱.清華大學(xué)出版社
評論