簡體   English   中英

將ARM代碼轉換為C

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM