[英]Conversion of ARM code into C
這是我的A9匯編代碼,
ldr x1, = 0x400020 // Const value may be address also
ldr w0, = 0x200018 // Const value may be address also
str w0, [x1]
以下是預期的輸出?
*((u32 *)0x400020) = 0x200018;
當我通過編譯器對其進行交叉檢查時,它給出了不同的結果,如mov和movs插入了ldr。 如何在c中創建ldr?
當我通過編譯器對其進行交叉檢查時,它給出了mov和movs的differnet結果
在我看來,您是使用針對AArch32的編譯器來編譯C代碼的,但是您顯示的匯編代碼看起來像是為AArch64編寫的。 這是我使用ARM64 GCC 5.4和優化級別O3
編譯時得到的結果(我添加的評論):
mov x0, 32 @ x0 = 0x20
mov w1, 24 @ w1 = 0x18
movk x0, 0x40, lsl 16 @ x0[31:16] = 0x40
movk w1, 0x20, lsl 16 @ w1[31:16] = 0x20
str w1, [x0]
如何在c中創建ldr?
在這種情況下,我看不出您希望編譯器生成LDR
任何充分理由。
LDR reg,=value
是偽指令 ,允許您加載無法直接在指令字中編碼的立即數。 匯編程序通過將值(例如0x200018
)放置在文字池中 ,然后用來自該文字池的PC相對負載(如ldr w0,[pc,#offset_to_value]
)替換ldr w0, =0x200018
來實現此目的。 訪問內存的速度很慢,因此編譯器為您生成了另一條指令序列,以更有效的方式實現了相同的目的。
偽指令主要是為人類編寫匯編代碼提供了便利,使他們或他們的同事更易於閱讀/編寫/維護代碼。 與人類不同,編譯器不會因一遍又一遍地重復相同的任務而感到疲勞,因此不需要太多的便利。
TL; DR:編譯器將生成它認為是最佳的(根據當前的優化級別)指令序列。 另外, LDR
這種特殊形式是偽指令,因此即使禁用所有優化,您也可能無法使編譯器生成它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.