ARM匯編中LDR與LTORG的關(guān)系
最近對LDR與LTORG有了一些新的認(rèn)識。
LDR是一個比較的指令。作用是從存儲器到寄存器的單一數(shù)據(jù)讀取指令。它有19條指令格式。
其中有兩條格式為宏指令(macro),格式如下:
1,LDR
2,LDR
這里重點(diǎn)分析下第二條宏指令。它會被編譯器編譯成一條指令,把給定的32位數(shù)值保存到寄存器Rd.通常這掉指令是LDR
關(guān)于指令LDR
LTORG用于聲明一個數(shù)據(jù)緩沖池,(也稱為文字池)的開始。在使用偽指令LDR時,常常需要在適當(dāng)?shù)牡胤郊尤隠TORG聲明數(shù)據(jù)緩沖池,LDR加載的數(shù)據(jù)暫時被編譯器放于數(shù)據(jù)緩沖池中。
使用說明:
當(dāng)程序中使用LDR之類的指令時,數(shù)據(jù)緩沖池的使用可能越界。為防止越界發(fā)生,可使用LTONG偽操作定義數(shù)據(jù)緩沖池。通常大的代碼段可以使用多個數(shù)據(jù)緩沖池。ARM匯編編譯器一般把數(shù)據(jù)緩沖池放在代碼段的最后面,即下一代碼段開始之前,或者END偽操作之前。LTORG偽操作通常放在無條件跳轉(zhuǎn)指令之后,或者子程序返回指令之后,這樣處理器就不會錯誤的將數(shù)據(jù)緩沖池中的數(shù)據(jù)當(dāng)作指令來執(zhí)行。
示例代碼:
AREA Example ,CODE,READONLY; //聲明一個代碼段,名稱為Example,屬性為只讀
Start BL funcl
;code
funcl //子程序
;code
LDR R1,=0x800 //將0X800加載到R1
MOV PC,lr //子程序結(jié)束
LTORG//定義數(shù)據(jù)緩沖池
data SPACE 4200//從當(dāng)前開始分配40字節(jié)的內(nèi)存單元并初始化為0
END//程序結(jié)束
0x800的值被編譯器暫時放在了data[0-3]字段中。
評論