新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM匯編中LDR與LTORG的關(guān)系

ARM匯編中LDR與LTORG的關(guān)系

作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
看了arm匯編語言語法一個多月了??偹闳腴T了。當(dāng)然還有很多東西值得繼續(xù)努力推敲滴。

本文引用地址:http://m.butianyuan.cn/article/201611/318784.htm

最近對LDRLTORG有了一些新的認(rèn)識。

LDR是一個比較的指令。作用是從存儲器到寄存器的單一數(shù)據(jù)讀取指令。它有19條指令格式。

其中有兩條格式為宏指令(macro),格式如下:

1,LDRRd,

2,LDR Rd,=<32-bit-value>

這里重點(diǎn)分析下第二條宏指令。它會被編譯器編譯成一條指令,把給定的32位數(shù)值保存到寄存器Rd.通常這掉指令是LDRRd,[pc,#],這個32位數(shù)保存在以地址(pc+開始的一個文字池(literal pool)中。

關(guān)于指令LDRRd,[pc,#],大家就要復(fù)習(xí)一下arm匯編的"單寄存器load-store指令的尋址方式"了。這里使用到了它的前變址尋址方式。 pc的值不變,尋找的內(nèi)存值為mem[pc+offset]。

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]字段中。



關(guān)鍵詞: ARM匯編LDRLTOR

評論


技術(shù)專區(qū)

關(guān)閉