ARM指令中特殊符號意義

ARM 中經常使用的一些表明指令的符號
特殊符號   對應指令     含義  
    =           DCB              
分配一片連續的字節存儲單元並用指定的數據初始化

    &           DCD             
分配一片連續的字存儲單元並用指定的數據初始化
    %           SPACE       
分配一片連續的存儲單元
    ^           MAP             
定義一個結構化內存表的首地址
    #           FILED          
定義一個結構化內存表的數據域 (常常和MAP使  
                    用,一個定義起始地址,一個定義長度)         
   *            EQU              
爲程序中的常量、標號等定義一個等效的字符名稱,
  !                                 地址更新,結果寫回到Rn中,Rn不容許是 R15
   [  |  ]                          
至關於IF  ELSE  ENDIF
 
其餘:
LDM中{∧}爲可選後綴,當指令爲LDM且寄存器列表中包含R15,選用該後綴時表示:除了正常的數據傳送以外, 還將SPSR複製到CPSR。同時,該後綴還表示傳入或傳出的是 用戶模式下的寄存器,而不是當前模式下的寄存器。 
TST R1,# 1   // 用於測試在寄存器R1中是否設置了最低位(%表示二進制數)
n  
 $:若是在串變量前有一個$則在彙編時編譯器將用該串變量的數值取代該串變量,如:
GBLS    STR1
GBLS    STR2
STR1    SETS      「pen.」
STR2    SETS      「This is a $STR1"
編譯後的結果是STR2的值爲This is a pen.
若是$後是數字變量(與串變量區分),在彙編時編譯器將該數字變量的數值轉換成十六進制的串,而後用該十六進制的串取代$後的數字變量。
若是$後是邏輯變量,在彙編時編譯器將該邏輯變量替換成它的取值(T或者F)。
若是程序中須要 $ ,則用 $$ 來表示,編譯器將不進行變量替換
注意:在兩個豎線 「|」 之間的 $ 並不表示進行變量替換,但若是 「|」 是在雙引號內,則將進行變量替換。
 
B .    //表示程序進入死循環。'.'location counter,可在源文件中指示當前地址。該符號能夠被引用或賦值。
 
ARM彙編程序中的符號
在ARM彙編語言中,符號(symbols)能夠表明地址(addresse)、變量(variables)和數字常量(numeric constants)。當符號表明地址時,又稱爲標號(lable)。當標號以數字開頭時,其做用範圍爲當前段(當前段沒有使用ROUT僞操做時),這種標號又稱爲局部標號(lacal lable)。符號變量包括變量、數字常量、標號和局部標號。
一、變量
在程序中,變量的值在彙編處理過程當中可能會發生改變。在ARM彙編中變量有數字變量、邏輯變量和串變量3種類型。變量的類型在程序中是不能夠改變的。
數字變量的取值範圍爲數字常量和數字表達式所能表示的數值;邏輯變量的取值範圍爲{true}和{flash};串變量的取值範圍爲串表達式能夠表達的範圍。
在ARM彙編語言中,使用GBLA、GBLL及GBLS聲明全局變量;使用LCLA、LCLL及LCLS聲明局部變量;使用SETA、SETL及SETS爲這些變量賦值。
二、數字常量
數字常量是32位的整數。在ARM彙編語言中,使用EQU來定義數字常量。數字常量一經定義就不可修改。 進行大小比較時,認爲數字常量都是無符號數
三、彙編時變量的替換
若是在串變量前有一個$字符,在彙編時編譯器將用改串的數值來取代該串變量。
對於數字變量來講,若是該變量前面有一個$字符,在彙編時編譯器將該數字變量的數值轉換成十六進制的串,而後用該十六進制的串取代$字符後的數字變量。
對於邏輯變量來講,若是該邏輯變量前面有一個$字符,在彙編時編譯器將該邏輯變量替換成它的取值(T或者F)
若是程序中須要字符$,則用$$來表示,編譯器將不進行變量替換,而是將$$看成$.
一般狀況下,包含在兩個豎線(|)之間的$並不表示進行變量替換。可是若是豎線(|)是在雙引號內,則將進行變量替換。
使用「.」來表示變量名稱的結束
四、標號
標號是表示程序中的指令或者數據地址的符號。根據標號的生成方式可分爲3種:
基於PC的標號。基於PC的標號是位於目標指令前或者程序中數據定義僞操做前的標號。這種標號在彙編時將被處理成PC值加上(或減去)一個數字常量。經常使用於表示跳轉指令的目標地址,或者代碼段中所嵌入的少許數據。
基於寄存器的標號。基於寄存器的標號經常使用MAP和FIELD未定義操做,也能夠該用EQU僞定義。這種標號在彙編時將被處理成寄存器的值加上(或減去)一個數據常量。經常使用於訪問數據段中的數據。
絕對地址。絕對地址是一個32位數據。它能夠尋址2^32 -1,即直接能夠尋址整個內存空間。
五、局部標號
局部標號主要在局部範圍內使用。它由兩部組成:開頭是一個0-99直接的數字,後面緊接一個一般表示該局部變量做用範圍的符號。
局部變量的做用範圍一般爲當前段,也能夠用僞操做ROUT來定義局部變量的做用範圍。
局部變量定義的語法格式以下:
N{routname},其中,N爲0~99之間的數字。routname爲符號,一般爲該變量做用範圍的名稱(用ROUT僞操做定義的)。
局部變量引用的語法格式以下:
%{F|B}{A|T}N{routname}
其中,N爲局部變量的數字號。
routname 爲當前做用範圍的名稱(用ROUT僞操做定義的)
%表示引用操做
F指示編譯器只向前搜索
B指示編譯器只向後搜索
A指示編譯器搜索宏的全部嵌套層次
T指示編譯器搜索宏的當前層次
若是F和B都沒有指定,編譯器先向前搜索,再向後搜索
若是A和T都沒有指定,編譯器搜索全部從當前層次到宏的最高層次,比當前層次低的層次再也不搜索。
若是指定了routname,編譯器向前搜索最近的ROUT僞操做,若routname與該ROUT僞操做定義的名稱不匹配,編譯器報告錯誤,彙編失敗。
ARM彙編語言中的表達式
表達式是由符號、數值、單目或多目操做符以及括號組成的。
一、字符串表達式
字符串表達式由字符串、字符串變量、操做符以及括號組成。字符串的最大長度爲512字節,最小長度爲0.下面介紹字符串表達式的組成元素。
字符串:由包含在雙引號內的一系列的字符組成。字符串的長度受到ARM彙編語言語句長度的限制。當在字符串中包含美圓符號$或者引號"時,用$$表示一個$,用""表示一個"
字符串變量:用僞操做GBLS或者LCLS聲明,用SETS賦值。
操做符:
(1)LEN:返回字符串的長度
:LEN:A
其中,A爲字符串變量
(2)CHR:能夠將0~255之間的整數做爲含一個ASCII字符的字符串。當有些ASCII字符不方便放在字符串中時,可使用CHR將其放在字符串表達式中。
:CHR:A
其中,A爲某一字符的ASCII值
(3)STR:將一個數字量或者邏輯表達式轉換成串。對於32位的數字量而言,STR將其轉換成8個十六進制數組成的串;對於邏輯表達式而言,STR將其轉換成字符串T或者F
:STR:A
其中,A爲數字量或者邏輯表達式
(4)LEFT:返回一個字符串最左端必定長度的子串
A:LEFT:B
其中,A爲源字符串,B爲數字量,表示LEFT將返回的字符個數
(5)RIGHT:返回一個字符串最右端必定長度的子串
A:RIGHT:B
其中,A爲源字符串,B爲數字量,表示RIGHT將返回的字符個數
(6)CC:用於鏈接兩個字符串。
A:CC:B
其中,A爲第1個源字符串。B爲第2個源字符串。CC操做符將字符串B鏈接在字符串A的後面。
二、數字表達式
數字表達式由數字常量、數字變量、操做符和括號組成
數字變量用僞操做GBLA或者LCLA聲明,用SETA賦值,它表明一個32位的數字量。
操做符:
(1)NOT:按位取反
:NOT:A
其中,A爲一個32位數字量
(2)+、—、×、/及MOD算術操做符
A+B,A-B,A×B,A/B
A:MOD:B表示A除以B的餘數
(3)ROL,ROR,SHL,SHR移位
A:ROL:B將整數A循環左移B位
A:SHL:B將整數A左移B位
(4)AND、OR及EOR按位邏輯操做符
A:AND:B將數字表達式A和B按位做邏輯與操做
三、基於寄存器和基於PC的表達式
基於寄存器的表達式表示了某個寄存器的值加上(或者減去)一個數字表達式
基於PC的表達式表示了PC寄存器的值加上(或減去)一個數字表達式。基於PC的表達式一般由程序中的標號與一個數字表達式組成。相關的操做符:
(1)BASE:返回基於寄存器的表達式中的寄存器編號。
:BASE:A    A爲基於寄存器的表達式
(2)INDEX:返回基於寄存器的表達式相對於其基址寄存器的偏移量。
:INDEX:A   A爲基於寄存器的表達式
(3)+、﹣:正負號,能夠放在數字表達式或者基於PC的表達式前面。
+A(﹣A)   A爲基於PC的表達式或者數字表達式
四、邏輯表達式
由邏輯量、邏輯操做符、關係操做符以及括號組成,取值範圍爲{FLASE}和{TRUE}
關係操做符:用於表示兩個同類表達式之間的關係。關係操做符和它的兩個操做數組成一個邏輯表達式,其取值爲{FALSE}或{TRUE}
如A=B 表示A等於B
A/=B,A<>B表示A不等於B
邏輯操做符:進行兩個邏輯表達式之間的基本邏輯操做。操做的結果爲{FLASE}或{TRUE}
:LNOT:A 邏輯表達式A的值取反
A:LAND:B邏輯表達式A和B邏輯與
五、其餘的一些操做符
(1)?:返回定義符號A的代碼行所生成的可執行代碼的字節數
?A
其中,A爲一個符號
(2)DEF:判斷某個符號是否已定義
:DEF:A若是符號A已經定義,上述結果爲{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
相關文章
相關標籤/搜索