ARN匯編器支持ARM偽指令,這些偽指令在匯編階段被翻譯成ARM或Thumb指令。ARM偽指令包含ADR、ADRL、MOV32和LDR。
一、ADR偽指令
1、作用
ADR是小范圍地址讀取偽指令,基於PC相對偏移地址或基於寄存器相對偏移地址讀取到寄存器中,當地址值是字節對齊時,取值范圍為-255到255,當地址值是字對齊時,取值范圍-1020到1020
2、語法格式
ADR{<condition>}{.W} register,label
3、參數說明
3.1、.W:可選項,指定指令寬度
3.2、register:目標寄存器
3.3、label:基於PC或具有寄存器的表達式
二、ADRL偽指令
1、作用
ADRL是中等范圍地址讀取偽指令,基於PC相對偏移的地址或基於寄存器相對偏移的地址值讀取到寄存器中,當地址值是字節對齊時,取值范圍為-64KB到64KB,當地址值是字對齊時,取值范圍為-256KB到256KB。
2、語法格式
ADRL{<condition>} register,label
3、參數說明
3.1、register:目標寄存器
3.2、label:基於PC或具體寄存器的表達式
4、與ADR的區別
ADRL偽指令比ADR偽指令可以讀取更大范圍的地址,這是因為在編譯階段,ADRL偽指令被編譯器換成兩條指令。如果匯編器不能再兩條指令內完成操作,將報告錯誤,終止編譯。
三、LDR偽指令
1、作用
裝載一個32位常數和一個地址到寄存器
2、語法格式
LDR{<condition>}{.W} register,=[expr|label-expr]
3、參數說明
3.1、.W:指定指令寬度
3.2、register:目標寄存器
3.3、expr:32位常量表達式,匯編器根據expr的取值情況,對LDR偽指令做如下處理:
3.3.1、當expr表示的地址值沒有超過MOV或MVN指令的地址取值范圍時,匯編器用一對MOV和MVN指令代替LDR指令。
3.3.2、當expr表示的指令地址超過了MOV或MVN指令的地址范圍時,匯編器將常量放在數據緩存池,同時用一條基於PC的LDR指令讀取該常量。
3.4、label-expr:一個程序相關或聲明為外部的表達式
4、舉例
將常數0xff0讀到r1中
LDR r3,=0xff0,相當於:MOV r3,#0xff0(注:由於帶立即數的指令會因為ARM32位等寬造成指令限制,導致有些情況下用偽指令代替操作立即數的指令,如:MOV r3,0x123,此時會報錯“invalid constant (123) after fixup”)
四、NOP偽指令
1、作用
執行一條空操作,多用於延時,該指令一般被替換成如:mov r0,r0這樣一條指令
2、語法格式
NOP