新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM匯編書(shū)寫(xiě)格式及符號(hào)(symbol)和表達(dá)式(expr)

        ARM匯編書(shū)寫(xiě)格式及符號(hào)(symbol)和表達(dá)式(expr)

        作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
        匯編語(yǔ)言的語(yǔ)句格式如下:

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

        本文引用地址:http://www.104case.com/article/201611/319058.htm

        symbol:標(biāo)號(hào)/局部標(biāo)號(hào)/常量/變量

        instruction:指令

        directive:偽操作

        pseudo-instruction:偽指令

        comment:注釋

        {}中括號(hào)內(nèi)是可選

        注意:

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

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

        3.指令不能頂格書(shū)寫(xiě)。

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

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

        ARM匯編語(yǔ)言中的符號(hào)

        symbol(標(biāo)號(hào))

        本質(zhì):代表一個(gè)地址值。段內(nèi)標(biāo)號(hào)的地址值在匯編時(shí)確定;段外標(biāo)號(hào)的地址值在連接時(shí)確定。

        分類(lèi):3類(lèi)(分類(lèi)依據(jù)了 標(biāo)號(hào)的生成方式)

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

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

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

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

        symbol(常量)

        數(shù)字常量是32位的整數(shù)。在ARM匯編語(yǔ)言中,使用EQU來(lái)定義數(shù)字常量。數(shù)字常量一經(jīng)定義就不可修改。進(jìn)行大小比較時(shí),認(rèn)為數(shù)字常量都是無(wú)符號(hào)數(shù)。

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

        字符常量:用一對(duì)單引號(hào)括起,包含一個(gè)單字符或標(biāo)準(zhǔn)C中的轉(zhuǎn)義字符。例如:‘A’‘n’

        字符串常量:由一對(duì)雙引號(hào)括起,包含一個(gè)字符串或標(biāo)準(zhǔn)C中的轉(zhuǎn)義字符

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

        }

        注意:1.匯編器對(duì)-n和2^32-1不做區(qū)別;匯編時(shí)對(duì)關(guān)系運(yùn)算符采用無(wú)符號(hào)數(shù)方式處理,這就意味著當(dāng)0>-1是

        {FLASE}的

        symbol(變量)

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

        無(wú)符號(hào)數(shù)[0,2的32次方-1],有符號(hào)數(shù)[負(fù)2的31次方,正2的31次方-1]

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

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

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

        “.”也可能表示 當(dāng)前指令地址(見(jiàn)下表)


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

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

        4. ARM嵌入式應(yīng)用技術(shù)基礎(chǔ).劉凱.清華大學(xué)出版社



        關(guān)鍵詞: ARM匯編書(shū)寫(xiě)格

        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 庐江县| 新和县| 望谟县| 宣化县| 阿鲁科尔沁旗| 大石桥市| 兰州市| 东兴市| 久治县| 林口县| 罗定市| 旺苍县| 蓝田县| 安西县| 防城港市| 长顺县| 海晏县| 鸡泽县| 甘谷县| 青海省| 蒙自县| 秭归县| 广安市| 滨海县| 唐海县| 库尔勒市| 安化县| 文水县| 昭通市| 肥东县| 巴马| 乳山市| 满洲里市| 华宁县| 台中县| 密山市| 什邡市| 蒲城县| 迁西县| 丹凤县| 麻阳|