新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM匯編程序設(shè)計(jì)之: ARM匯編器所支持的偽指令

        ARM匯編程序設(shè)計(jì)之: ARM匯編器所支持的偽指令

        作者: 時(shí)間:2013-09-30 來(lái)源:網(wǎng)絡(luò) 收藏

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

        10.2匯編器所支持的

        匯編器支持,這些在匯編階段被翻譯成ARM或者Thumb(或Thumb-2)指令(或指令序列)。ARM偽指令包含ADR、ADRL、MOV32和LDR。

        ·ADR偽指令(program-relative)或(register-relative)地址(小范圍地址)到寄存器。

        ·ADRL偽指令(program-relative)或(register-relative)地址(中等范圍地址)到寄存器。

        ·MOV32裝載32位常數(shù)或地址到寄存器(ARMv6T2體系結(jié)構(gòu)及以上版本支持)。

        ·LDR裝載32位常數(shù)或地址到寄存器(所有ARM版本均支持)。

        10.2.1ADR偽指令

        (1)語(yǔ)法格式

        ADR為小范圍地址讀取偽指令。ADR偽指令將基于PC相對(duì)偏移地址或基于寄存器相對(duì)偏移地址值讀取到寄存器中,當(dāng)?shù)刂分凳亲止?jié)對(duì)齊時(shí),取值范圍為−255~255,當(dāng)?shù)刂分凳亲謱?duì)齊時(shí),取值范圍−1020~1020。當(dāng)?shù)刂分凳?6字節(jié)對(duì)齊時(shí)其取值范圍更大。

        語(yǔ)法格式如下。

        ADR{cond}{.W}register,label

        ①cond

        可選的指令執(zhí)行條件。

        ②.W

        可選項(xiàng)。指定指令寬度(Thumb-2指令集支持)。

        ③register

        目標(biāo)寄存器。

        ④label

        基于PC或具有寄存器的表達(dá)式。

        (2)使用說(shuō)明

        ADR被匯編器編譯成一條指令。匯編器通常使用ADD或SUB指令來(lái)實(shí)現(xiàn)偽操作的地址裝載功能。如果不能用一條指令來(lái)實(shí)現(xiàn)ADR偽指令的功能,匯編器將報(bào)告錯(cuò)誤。

        (3)示例

        LDRr4,=data+4*n ;n是匯編時(shí)產(chǎn)生的變量

        ;code

        MOVpc,lr

        dataDCDvalue0

        ;n-1條DCD偽操作

        DCDvaluen ;所要裝載入r4的值

        ;更多DCD偽操作

        10.2.2ADRL偽指令

        (1)語(yǔ)法格式

        ADRL為中等范圍地址讀取偽指令。ADRL偽指令將基于PC相對(duì)偏移的地址或基于寄存器相對(duì)偏移的地址值讀取到寄存器中,當(dāng)?shù)刂分凳亲止?jié)對(duì)齊時(shí),取值范圍為−64KB~64KB,當(dāng)?shù)刂分凳亲謱?duì)齊時(shí),取值范圍為−256KB~256KB。當(dāng)?shù)刂分凳?6字節(jié)對(duì)齊時(shí),其取值范圍更大。在32-bit的Thumb-2指令中,地址取值范圍到達(dá)±1MB。

        注意

        ADRL只能用在ARM匯編或Thumb-2匯編中,Thumb匯編器不支持ADRL偽指令。

        語(yǔ)法格式如下。

        ADRL{cond}register,label

        ①cond

        可選的指令執(zhí)行條件。

        ②register

        目標(biāo)寄存器。

        ③label

        基于PC或具體寄存器的表達(dá)式。

        (2)使用說(shuō)明

        ADRL偽指令與ADR偽指令相似,用于將基于PC相對(duì)偏移的地址或基于寄存器相對(duì)偏移的地址值讀取到寄存器中。所不同的是ADRL偽指令比ADR偽指令可以讀取更大范圍的地址。這是因?yàn)樵诰幾g階段,ADRL偽指令被編譯器換成兩條指令。即使一條指令可以完成該操作,編譯器也將產(chǎn)生兩條指令,其中一條為多余指令。如果匯編器不能在兩條指令內(nèi)完成操作,將報(bào)告錯(cuò)誤,中止編譯。

        注意

        如果使用ADRL偽指令裝載標(biāo)號(hào)地址,那么被裝載的標(biāo)號(hào)必須和偽指令A(yù)DRL在同一個(gè)段中。

        10.2.3MOV32偽指令

        (1)語(yǔ)法格式

        MOV32偽指令裝載一個(gè)32位常數(shù)或地址到寄存器。

        與ADR和ADRL指令不同,MOV32偽指令裝載的地址是位置相關(guān)地址。

        語(yǔ)法格式如下。

        MOV32{cond}register,expr

        ①cond

        可選的指令執(zhí)行條件。

        ②register

        目標(biāo)寄存器。

        ③expr

        表達(dá)式,可以是下面幾種形式。

        ·symbol:程序中定義的標(biāo)號(hào)地址。

        ·constant:任意32-bit的常數(shù)。

        ·symbol+constant:地址標(biāo)號(hào)加32-bit常數(shù)。

        (2)使用說(shuō)明

        一般情況下匯編器將一條MOV32偽指令翻譯成一對(duì)MOV和MOVT指令。這樣任何32-bit常量都可以被裝載到寄存器。

        注意

        通過(guò)這種方法裝載的程序地址是在程序鏈接時(shí)由鏈接器確定的,是位置相關(guān)地址。


        上一頁(yè) 1 2 下一頁(yè)

        評(píng)論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 高邮市| 泰州市| 阿克陶县| 阿尔山市| 旬邑县| 延津县| 大名县| 海口市| 托克托县| 修武县| 元阳县| 鸡泽县| 杭州市| 宜春市| 惠东县| 潮安县| 阳江市| 鄄城县| 含山县| 青浦区| 迁西县| 石家庄市| 新乐市| 西乡县| 凤冈县| 原阳县| 阳原县| 凤凰县| 平陆县| 岑溪市| 怀仁县| 忻城县| 东城区| 虞城县| 嘉峪关市| 栖霞市| 双峰县| 清水县| 肇东市| 郎溪县| 南宁市|