ARM匯編程序設(shè)計(jì)之: ARM匯編器所支持的偽指令
10.2.4LDR偽指令
(1)語(yǔ)法格式
LDR偽指令裝載一個(gè)32-bit常數(shù)和一個(gè)地址到寄存器。
語(yǔ)法格式如下。
LDR{cond}{.W}register,=[expr|label-expr]
①cond
可選的指令執(zhí)行條件。
②.W
可選項(xiàng)。指定指令寬度(Thumb-2指令集支持)。
③register
目標(biāo)寄存器。
④expr
32位常量表達(dá)式。匯編器根據(jù)expr的取值情況,對(duì)LDR偽指令做如下處理。
·當(dāng)expr表示的地址值沒(méi)有超過(guò)MOV或MVN指令的地址取值范圍時(shí),匯編器用一對(duì)MOV和MVN指令代替LDR指令。
·當(dāng)expr表示的指令地址值超過(guò)了MOV或MVN指令的地址范圍時(shí),匯編器將常數(shù)放入數(shù)據(jù)緩存池,同時(shí)用一條基于PC的LDR指令讀取該常數(shù)。
⑤label-expr
一個(gè)程序相關(guān)或聲明為外部的表達(dá)式。匯編器將label-expr表達(dá)式的值放入數(shù)據(jù)緩存池,使用一條程序相關(guān)LDR指令將該值取出放入寄存器。
當(dāng)label-expr為聲明為外部的表示式時(shí),匯編器將在目標(biāo)文件中插入鏈接重定位偽操作,由鏈接器在鏈接時(shí)生成該地址。
(2)使用說(shuō)明
當(dāng)要裝載的常量超出了MOV或MVN指令的范圍時(shí),使用LDR指令。
由LDR指令裝載的地址是絕對(duì)地址,即PC相關(guān)地址。
當(dāng)要裝載的數(shù)據(jù)不能由MOV或MVN指令直接裝載時(shí),該值要先放入數(shù)據(jù)緩存池,此時(shí)LDR偽指令處的PC值到數(shù)據(jù)緩存池中目標(biāo)數(shù)據(jù)所在地址的偏移量有一定限制。ARM或32-bit的Thumb-2指令中該范圍是±4KB,Thumb或16-bit的Thumb-2指令中為0~1KB。
(3)示例
①將常數(shù)0xff0讀到r1中。
LDRr3,=0xff0;
相當(dāng)于下面的ARM指令:
MOVr3,#0xff0
②將常數(shù)0xfff讀到r1中。
LDRr1,=0xfff;
相當(dāng)于下面的ARM指令:
LDRr1,[pc,offset_to_litpool]
...
litpoolDCD0xfff
③將place標(biāo)號(hào)地址讀入r1中。
LDRr2,=place;
相當(dāng)于下面的ARM指令:
LDRr2,[pc,offset_to_litpool]
...
litpoolDCDplace
評(píng)論