ARM 一些特殊符號

2021-06-25 09:47:07 字數 4946 閱讀 7270

特殊符號對應指令含義 

特殊符號  對應指令    含義

=           dcb              分配一片連續的位元組儲存單元並用指定的資料初始化

&          dcd              分配一片連續的字儲存單元並用指定的資料初始化

%          space          分配一片連續的儲存單元

^           map              定義乙個結構化記憶體表的首位址

#           filed            定義乙個結構化記憶體表的資料域

*           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)。符號變數包括變數、數字常量、標號和區域性標號。

1、變數

在程式中,變數的值在彙編處理過程中可能會發生改變。在arm彙編中變數有數字變數、邏輯變數和串變數3種型別。變數的型別在程式中是不可以改變的。

數字變數的取值範圍為數字常量和數字表示式所能表示的數值;邏輯變數的取值範圍為和;串變數的取值範圍為串表示式可以表達的範圍。

在arm組合語言中,使用gbla、gbll及gbls宣告全域性變數;使用lcla、lcll及lcls宣告區域性變數;使用seta、setl及sets為這些變數賦值。

2、數字常量

數字常量是32位的整數。在arm組合語言中,使用equ來定義數字常量。數字常量一經定義就不可修改。 進行大小比較時,認為數字常量都是無符號數。

3、彙編時變數的替換

如果在串變數前有乙個$字元,在彙編時編譯器將用改串的數值來取代該串變數。

對於數字變數來說,如果該變數前面有乙個$字元,在彙編時編譯器將該數字變數的數值轉換成十六進製制的串,然後用該十六進製制的串取代$字元後的數字變數。

對於邏輯變數來說,如果該邏輯變數前面有乙個$字元,在彙編時編譯器將該邏輯變數替換成它的取值(t或者f)

如果程式中需要字元$,則用$$來表示,編譯器將不進行變數替換,而是將$$當作$.通常情況下,包含在兩個豎線(|)之間的$並不表示進行變數替換。但是如果豎線(|)是在雙引號內,則將進行變數替換。

使用「.」來表示變數名稱的結束。

4、標號

標號是表示程式中的指令或者資料位址的符號。根據標號的生成方式可分為3種:基於pc的標號。基於pc的標號是位於目標指令前或者程式中資料定義偽操作前的標號。這種標號在彙編時將被處理成pc值加上(或減去)乙個數字常量。常用於表示跳轉指令的目標位址,或者**段中所嵌入的少量資料。

基於暫存器的標號。基於暫存器的標號常用map和field未定義操作,也可以該用equ偽定義。這種標號在彙編時將被處理成暫存器的值加上(或減去)乙個資料常量。常用於訪問資料段中的資料。

絕對位址。絕對位址是乙個32位資料。它可以定址2^32 -1,即直接可以定址整個記憶體空間。

5、區域性標號

區域性標號主要在區域性範圍內使用。它由兩部組成:開頭是乙個0-99直接的數字,後面緊接乙個通常表示該區域性變數作用範圍的符號。

區域性變數的作用範圍通常為當前段,也可以用偽操作rout來定義區域性變數的作用範圍。

區域性變數定義的語法格式如下:

n,其中,n為0~99之間的數字。routname為符號,通常為該變數作用範圍的名稱(用rout偽操作定義的)。

區域性變數引用的語法格式如下: %n

其中,n為區域性變數的數字號。

routname為當前作用範圍的名稱(用rout偽操作定義的)

%表示引用操作

f指示編譯器只向前搜尋

b指示編譯器只向後搜尋

a指示編譯器搜尋巨集的所有巢狀層次

t指示編譯器搜尋巨集的當前層次

如果f和b都沒有指定,編譯器先向前搜尋,再向後搜尋如果a和t都沒有指定,編譯器搜尋所有從當前層次到巨集的最高層次,比當前層次低的層次不再搜尋。

如果指定了routname,編譯器向前搜尋最近的rout偽操作,若routname與該rout偽操作定義的名稱不匹配,編譯器報告錯誤,彙編失敗。

arm組合語言中的表示式

表示式是由符號、數值、單目或多目操作符以及括號組成的。

1、字串表示式

字串表示式由字串、字串變數、操作符以及括號組成。字串的最大長度為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的後面。

2、數字表示式

數字表示式由數字常量、數字變數、操作符和括號組成

數字變數用偽操作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按位作邏輯與操作

3、基於暫存器和基於pc的表示式

基於暫存器的表示式表示了某個暫存器的值加上(或者減去)乙個數字表示式

基於pc的表示式表示了pc暫存器的值加上(或減去)乙個數字表示式。基於pc的表示式通常由程式中的標號與乙個數字表示式組成。相關的操作符:(1)base:返回基於暫存器的表示式中的暫存器編號。

:base:a a為基於暫存器的表示式

(2)index:返回基於暫存器的表示式相對於其基址暫存器的偏移量。

:index:a a為基於暫存器的表示式

(3)+、﹣:正負號,可以放在數字表示式或者基於pc的表示式前面。

+a(﹣a)a為基於pc的表示式或者數字表示式

4、邏輯表示式

由邏輯量、邏輯操作符、關係操作符以及括號組成,取值範圍為和關係操作符:用於表示兩個同類表示式之間的關係。關係操作符和它的兩個運算元組成乙個邏輯表示式,其取值為或

如a=b表示a等於b

a/=b,a<>b表示a不等於b邏輯操作符:進行兩個邏輯表示式之間的基本邏輯操作。操作的結果為或

:lnot:a邏輯表示式a的值取反

a:land:b邏輯表示式a和b邏輯與

5、其他的一些操作符

(1)?:返回定義符號a的**行所生成的可執行**的位元組數?a其中,a為乙個符號

(2)def:判斷某個符號是否已定義

:def:a

如果符號a已經定義,上述結果為,否則為

(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

C 中一些特殊符號

n 換行 r 回車 t 製表符 b 退格 f 換頁 0 空符號 雙引號 單引號 反斜槓 t 橫向跳到下一製表位置 v 豎向跳格 b 退格 f 走紙換頁 a 鳴鈴 注 有些 ascii 字元是不可列印的。例如退格 另起一行 警報等。c 語言提供了兩種方法來表示這種不可列印字元。第一種方法是使用 asc...

shell指令碼中一些特殊符號

1 大括號 用法一 萬用字元擴充套件 eg ls my s 這條命令相當於如下命令的組合 ls my fingers my toes eg mkdir 我們將得到 usera home,usera bin,usera data,userb home,userb bin,userb data,user...

ORACLE 中的一些特殊符號

oracle萬用字元,運算子的使用 用於where比較條件的有 等於 包含 in not in exists not exists 範圍 between.and not between.and 匹配測試 like not like null測試 is null is not null 萬用字元 在w...