僞指令LTORG

轉自:http://blog.csdn.net/lemon_fantasy/article/details/2612860

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

語法 LTORG

使用說明:

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

    LDR僞指令在彙編時,如果立即數可以用<shifter_operand>表示的話就替換爲MOV或MVN指令;如果不能用其表示則需要將該立即數放到一個文字池中,並生成一條將該文字池內容加載到目標寄存器的LDR指令。而使用LDR指令必須保證文字池在其可以訪問的地址範圍之內,對於ARM指令集來說就是4KB,所以必須在LDR指令前後4KB的範圍內用LTORG顯式地在代碼段中添加一個文字池。

LTORG是在此指令出現的地方放一個文本池(literal pool). 在ARM彙編中常用到

    ldr   r0, =instruction     將地址instruction載入r0.

此時編譯器將ldr儘可能的轉變成mov或mvn指令。

如果轉變不成, 將產生一個ldr指令, 通過pc相對地址從一塊保存常數的內存區讀出instruction的值。此內存區既是文本池。一般的, 文本池放在END指令之後的地方。但是, 如果偏移地址大於4k空間, ldr指令會出錯(因爲ldr的相對偏移地址爲12-bit的值). 此時使用LTORG放到會出錯的ldr指令附近, 以解決此問題。編譯器會收集沒有分配的ldr的值放到此文本池中。



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