ARM中LTORG的使用

看了arm彙編語言語法一個多月了。總算入門了。當然還有很多東西值得繼續努力推敲滴。

 

最近對LDR與LTORG有了一些新的認識。

 

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

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

1,LDR<cond><type>Rd,<label>

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

 

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

 

關於指令LDR<cond>Rd,[pc,#<offset>],大家就要複習一下arm彙編的"單寄存器load-store指令的尋址方式"了。這裏使用到了它的前變址尋址方式。 pc的值不變,尋找的內存值爲mem[pc+offset]。

 

LTORG用於聲明一個數據緩衝池,(也稱爲文字池)的開始。在使用僞指令LDR時,常常需要在適當的地方加入LTORG聲明數據緩衝池,LDR加載的數據暫時被編譯器放於數據緩衝池中。

使用說明:

當程序中使用LDR之類的指令時,數據緩衝池的使用可能越界。爲防止越界發生,可使用LTONG僞操作定義數據緩衝池。通常大的代碼段可以使用多個數據緩衝池。ARM彙編編譯器一般把數據緩衝池放在代碼段的最後面,即下一代碼段開始之前,或者END僞操作之前。LTORG僞操作通常放在無條件跳轉指令之後,或者子程序返回指令之後,這樣處理器就不會錯誤的將數據緩衝池中的數據當作指令來執行。

 

示例代碼:

AREA   Example ,CODE,READONLY;  //聲明一個代碼段,名稱爲Example,屬性爲只讀

Start    BL  funcl

    ;code

funcl                                       //子程序

    ;code

    LDR  R1,=0x800               //將0X800加載到R1

    MOV  PC,lr                       //子程序結束

LTORG                                   //定義數據緩衝池

data   SPACE 4200               //從當前開始分配40字節的內存單元並初始化爲0

END                                      //程序結束

 

0x800的值被編譯器暫時放在了data[0-3]字段中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章