ARM匯編程序設(shè)計(jì)之: ARM匯編器所支持的偽指令
10.2ARM匯編器所支持的偽指令
ARM匯編器支持ARM偽指令,這些偽指令在匯編階段被翻譯成ARM或者Thumb(或Thumb-2)指令(或指令序列)。ARM偽指令包含ADR、ADRL、MOV32和LDR。
·ADR偽指令裝載程序相關(guān)(program-relative)或寄存器相關(guān)(register-relative)地址(小范圍地址)到寄存器。
·ADRL偽指令裝載程序相關(guān)(program-relative)或寄存器相關(guān)(register-relative)地址(中等范圍地址)到寄存器。
·MOV32裝載32位常數(shù)或地址到寄存器(ARMv6T2體系結(jié)構(gòu)及以上版本支持)。
·LDR裝載32位常數(shù)或地址到寄存器(所有ARM版本均支持)。
10.2.1ADR偽指令
(1)語法格式
ADR為小范圍地址讀取偽指令。ADR偽指令將基于PC相對偏移地址或基于寄存器相對偏移地址值讀取到寄存器中,當(dāng)?shù)刂分凳亲止?jié)對齊時,取值范圍為−255~255,當(dāng)?shù)刂分凳亲謱R時,取值范圍−1020~1020。當(dāng)?shù)刂分凳?6字節(jié)對齊時其取值范圍更大。
語法格式如下。
ADR{cond}{.W}register,label
①cond
可選的指令執(zhí)行條件。
②.W
可選項(xiàng)。指定指令寬度(Thumb-2指令集支持)。
③register
目標(biāo)寄存器。
④label
基于PC或具有寄存器的表達(dá)式。
(2)使用說明
ADR被匯編器編譯成一條指令。匯編器通常使用ADD或SUB指令來實(shí)現(xiàn)偽操作的地址裝載功能。如果不能用一條指令來實(shí)現(xiàn)ADR偽指令的功能,匯編器將報(bào)告錯誤。
(3)示例
LDRr4,=data+4*n ;n是匯編時產(chǎn)生的變量
;code
MOVpc,lr
dataDCDvalue0
;n-1條DCD偽操作
DCDvaluen ;所要裝載入r4的值
;更多DCD偽操作
10.2.2ADRL偽指令
(1)語法格式
ADRL為中等范圍地址讀取偽指令。ADRL偽指令將基于PC相對偏移的地址或基于寄存器相對偏移的地址值讀取到寄存器中,當(dāng)?shù)刂分凳亲止?jié)對齊時,取值范圍為−64KB~64KB,當(dāng)?shù)刂分凳亲謱R時,取值范圍為−256KB~256KB。當(dāng)?shù)刂分凳?6字節(jié)對齊時,其取值范圍更大。在32-bit的Thumb-2指令中,地址取值范圍到達(dá)±1MB。
注意 | ADRL只能用在ARM匯編或Thumb-2匯編中,Thumb匯編器不支持ADRL偽指令。 |
語法格式如下。
ADRL{cond}register,label
①cond
可選的指令執(zhí)行條件。
②register
目標(biāo)寄存器。
③label
基于PC或具體寄存器的表達(dá)式。
(2)使用說明
ADRL偽指令與ADR偽指令相似,用于將基于PC相對偏移的地址或基于寄存器相對偏移的地址值讀取到寄存器中。所不同的是ADRL偽指令比ADR偽指令可以讀取更大范圍的地址。這是因?yàn)樵诰幾g階段,ADRL偽指令被編譯器換成兩條指令。即使一條指令可以完成該操作,編譯器也將產(chǎn)生兩條指令,其中一條為多余指令。如果匯編器不能在兩條指令內(nèi)完成操作,將報(bào)告錯誤,中止編譯。
注意 | 如果使用ADRL偽指令裝載標(biāo)號地址,那么被裝載的標(biāo)號必須和偽指令A(yù)DRL在同一個段中。 |
10.2.3MOV32偽指令
(1)語法格式
MOV32偽指令裝載一個32位常數(shù)或地址到寄存器。
與ADR和ADRL指令不同,MOV32偽指令裝載的地址是位置相關(guān)地址。
語法格式如下。
MOV32{cond}register,expr
①cond
可選的指令執(zhí)行條件。
②register
目標(biāo)寄存器。
③expr
表達(dá)式,可以是下面幾種形式。
·symbol:程序中定義的標(biāo)號地址。
·constant:任意32-bit的常數(shù)。
·symbol+constant:地址標(biāo)號加32-bit常數(shù)。
(2)使用說明
一般情況下匯編器將一條MOV32偽指令翻譯成一對MOV和MOVT指令。這樣任何32-bit常量都可以被裝載到寄存器。
注意 | 通過這種方法裝載的程序地址是在程序鏈接時由鏈接器確定的,是位置相關(guān)地址。 |
評論