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