新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM匯編書寫格式及符號(symbol)和表達式(expr)

ARM匯編書寫格式及符號(symbol)和表達式(expr)

作者: 時間:2016-11-20 來源:網(wǎng)絡 收藏
匯編語言的語句格式如下:

{symbol}{instruction/directive/pseud0-instruction}{;comment}

本文引用地址:http://m.butianyuan.cn/article/201611/319058.htm

symbol:標號/局部標號/常量/變量

instruction:指令

directive:偽操作

pseudo-instruction:偽指令

comment:注釋

{}中括號內是可選

注意:

1.symbol必須頂格書寫。(ARM匯編其后不加“:”)(GUN匯編要加“:”)

2.symbol命名規(guī)則:由字母,數(shù)字,下劃線組成;除局部標號外,不能以數(shù)字開頭。

3.指令不能頂格書寫。

4.ARM指令,偽指令,偽操作,寄存器名可以全部為大寫字母,也可全部為小寫字母;不可大小寫混用。

5.如果語句太長,可以將一條語句分幾行來書寫,在行末用“”表示換行(即下一行與本行為同一語句)。“”后不能有任何字符,包含空格和制表符(Tab)。

ARM匯編語言中的符號

symbol(標號)

本質:代表一個地址值。段內標號的地址值在匯編時確定;段外標號的地址值在連接時確定。

分類:3類(分類依據(jù)了 標號的生成方式)

基于PC的標號?;赑C的標號是位于目標指令前的標號或者程序中數(shù)據(jù)定義偽操作前的標號。這種標號在匯編時將被處理成PC值加上(或減去)一個數(shù)字常量。(常用于表示跳轉指令的目標地址,或者代碼段中所嵌入的少量數(shù)據(jù)。)
基于寄存器的標號?;诩拇嫫鞯臉颂柍S肕AP和FIELD來定義,也可以用EQU來定義。這種標號在匯編時將被處理成寄存器的值加上(或減去)一個數(shù)字常量。(常用于訪問數(shù)據(jù)段中的數(shù)據(jù)。)
絕對地址。絕對地址是一個32位 數(shù)據(jù)。它可以尋址的范圍為[0,232-1]即可以直接尋址整個內存空間。

symbol(局部標號)
局部標號主要在局部范圍內使用。它由兩部組成:開頭是一個0-99直接的數(shù)字,后面緊接一個通常表示該局部變量作用范圍的符號。
局部變量的作用范圍通常為當前段,也可以用ROUT來定義局部變量的作用范圍。
局部變量定義的語法格式:N{routname}
N:為0~99之間的數(shù)字。

routname:當前局部范圍的名稱(為符號),通常為該變量作用范圍的名稱(用ROUT偽操作定義的)。
局部變量引用的語法格式:%{F|B}{A|T}N{routname}
%:表示引用操作

N:為局部變量的數(shù)字號。
routname 為當前作用范圍的名稱(用ROUT偽操作定義的)
%:表示引用操作
F:指示編譯器只向前搜索
B:指示編譯器只向后搜索
A:指示編譯器搜索宏的所有嵌套層次
T:指示編譯器搜索宏的當前層次
注意:1.如果F和B都沒有指定,編譯器先向前搜索,再向后搜索
2.如果A和T都沒有指定,編譯器搜索所有從當前層次到宏的最高層次,比當前層次低的層次不再搜索。
3.如果指定了routname,編譯器向前搜索最近的ROUT偽操作,若routname與該ROUT偽操作定義的名稱不匹配,編譯器報告錯誤,匯編失敗。

symbol(常量)

數(shù)字常量是32位的整數(shù)。在ARM匯編語言中,使用EQU來定義數(shù)字常量。數(shù)字常量一經(jīng)定義就不可修改。進行大小比較時,認為數(shù)字常量都是無符號數(shù)。

{數(shù)字常量:十進制數(shù),十六進制數(shù),n_XXX(n表示n(2-9)進制數(shù),XXX是具體的數(shù),例如:8_3777)

字符常量:用一對單引號括起,包含一個單字符或標準C中的轉義字符。例如:‘A’‘n’

字符串常量:由一對雙引號括起,包含一個字符串或標準C中的轉義字符

布爾常量:{TRUE}和{FALSE}

}

注意:1.匯編器對-n和2^32-1不做區(qū)別;匯編時對關系運算符采用無符號數(shù)方式處理,這就意味著當0>-1是

{FLASE}的

symbol(變量)

在程序中,變量的值在匯編處理過程中可能會發(fā)生改變。在ARM匯編中變量有數(shù)字變量、邏輯變量和字符串變量3種類型。變量的類型在程序中是不可以改變的。
數(shù)字變量的取值范圍為數(shù)字常量和數(shù)字表達式所能表示的數(shù)值;

無符號數(shù)[0,2的32次方-1],有符號數(shù)[負2的31次方,正2的31次方-1]

邏輯變量的取值范圍為{true}和{flash};

字符串變量的取值范圍為串表達式可以表達的范圍。[0,512]字節(jié)

注意:匯編時變量的替換
1.如果在字符串變量前有一個$字符,在匯編時編譯器將用改串的數(shù)值來取代該字符串變量。
2.如果在數(shù)字變量前面有一個$字符,在匯編時編譯器將該數(shù)字變量的數(shù)值轉換成十六進制的串,然后用該十六進制的串取代$字符后的數(shù)字變量。
3.如果在邏輯變量前面有一個$字符,在匯編時編譯器將該邏輯變量替換成它的取值(T或者F)
4.如果程序中需要字符$,則用$$來表示,編譯器將不進行變量替換,而是將$$當作$.
通常情況下,包含在兩個豎線(|)之間的$并不表示進行變量替換。但是如果豎線(|)是在雙引號內,則將進行變量替換。
5.使用“.”來表示變量名稱的結束。

“.”也可能表示 當前指令地址(見下表)


ARM匯編語言中的表達式
表達式是由符號、數(shù)值、單目或多目操作符以及括號組成的。
1、字符串表達式
字符串表達式由字符串、字符串變量、操作符以及括號組成。字符串的最大長度為512字節(jié),最小長度為0.下面介紹字符串表達式的組成元素。
字符串:由包含在雙引號內的一系列的字符組成。字符串的長度受到ARM匯編語言語句長度的限制。當在字符串中包含美元符號$或者引號"時,用$$表示一個$,用""表示一個"。
字符串變量:用偽操作GBLS或者LCLS聲明,用SETS賦值。
操作符:
(1)LEN:返回字符串的長度
:LEN:A
其中,A為字符串變量
(2)CHR:可以將0~255之間的整數(shù)作為含一個ASCII字符的字符串。當有些ASCII字符不方便放在字符串中時,可以使用CHR將其放在字符串表達式中。
:CHR:A
其中,A為某一字符的ASCII值
(3)STR:將一個數(shù)字量或者邏輯表達式轉換成串。對于32位的數(shù)字量而言,STR將其轉換成8個十六進制數(shù)組成的串;對于邏輯表達式而言,STR將其轉換成字符串T或者F
:STR:A
其中,A為數(shù)字量或者邏輯表達式
(4)LEFT:返回一個字符串最左端一定長度的子串
A:LEFT:B
其中,A為源字符串,B為數(shù)字量,表示LEFT將返回的字符個數(shù)
(5)RIGHT:返回一個字符串最右端一定長度的子串
A:RIGHT:B
其中,A為源字符串,B為數(shù)字量,表示RIGHT將返回的字符個數(shù)
(6)CC:用于連接兩個字符串。
A:CC:B
其中,A為第1個源字符串。B為第2個源字符串。CC操作符將字符串B連接在字符串A的后面。
2、數(shù)字表達式
數(shù)字表達式由數(shù)字常量、數(shù)字變量、操作符和括號組成
數(shù)字變量用偽操作GBLA或者LCLA聲明,用SETA賦值,它代表一個32位的數(shù)字量。
操作符:
(1)NOT:按位取反
:NOT:A
其中,A為一個32位數(shù)字量
(2)+、—、×、/及MOD算術操作符
A+B,A-B,A×B,A/B
A:MOD:B表示A除以B的余數(shù)
(3)ROL,ROR,SHL,SHR移位
A:ROL:B將整數(shù)A循環(huán)左移B位
A:SHL:B將整數(shù)A左移B位
(4)AND、OR及EOR按位邏輯操作符
A:AND:B將數(shù)字表達式A和B按位作邏輯與操作
3、基于寄存器和基于PC的表達式
基于寄存器的表達式表示了某個寄存器的值加上(或者減去)一個數(shù)字表達式
基于PC的表達式表示了PC寄存器的值加上(或減去)一個數(shù)字表達式?;赑C的表達式通常由程序中的標號與一個數(shù)字表達式組成。相關的操作符:
(1)BASE:返回基于寄存器的表達式中的寄存器編號。
:BASE:A A為基于寄存器的表達式
(2)INDEX:返回基于寄存器的表達式相對于其基址寄存器的偏移量。
:INDEX:A A為基于寄存器的表達式
(3)+、﹣:正負號,可以放在數(shù)字表達式或者基于PC的表達式前面。
+A(﹣A) A為基于PC的表達式或者數(shù)字表達式
4、邏輯表達式
由邏輯量、邏輯操作符、關系操作符以及括號組成,取值范圍為{FLASE}和{TRUE}
關系操作符:用于表示兩個同類表達式之間的關系。關系操作符和它的兩個操作數(shù)組成一個邏輯表達式,其取值為{FALSE}或{TRUE}
如A=B 表示A等于B
A/=B,A<>B表示A不等于B
邏輯操作符:進行兩個邏輯表達式之間的基本邏輯操作。操作的結果為{FLASE}或{TRUE}
:LNOT:A 邏輯表達式A的值取反
A:LAND:B邏輯表達式A和B邏輯與
5、其他的一些操作符
(1)?:返回定義符號A的代碼行所生成的可執(zhí)行代碼的字節(jié)數(shù)
?A
其中,A為一個符號
(2)DEF:判斷某個符號是否已定義
:DEF:A
如果符號A已經(jīng)定義,上述結果為{TRUE},否則為{FLASE}
(3)SB_OFFSET_19_12
:SB_OFFSET_19_12:label 其中,label為一個標號
返回(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.html

2. ARM嵌入式系統(tǒng)結構與編程.邱鐵。清華大學出版社

3. ARM嵌入式系統(tǒng)入門.三恒星科技.中國電力出版社

4. ARM嵌入式應用技術基礎.劉凱.清華大學出版社



關鍵詞: ARM匯編書寫格

評論


技術專區(qū)

關閉