ARM代码到C语言的转换

ARM代码到C语言的转换,c,assembly,arm,C,Assembly,Arm,这是我的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,而不是ld

这是我的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和mov

在我看来,您似乎是使用针对AArch32的编译器编译了C代码,但您显示的汇编代码似乎是为AArch64编写的。 以下是我使用ARM64 GCC 5.4和优化级别O3编译时得到的结果(我添加了注释):

如何在c中创建ldr

在这种情况下,我看不出有什么好的理由让编译器生成
LDR

LDR reg,=value
是一条伪指令,允许您加载不能直接在指令字中编码的即时指令。汇编程序通过将值(例如,
0x200018
)放在a中,然后用该文本池中的PC相对负载替换
ldr w0,=0x200018
(例如,
ldr w0,[PC,#offset_to_value]
)。访问内存的速度很慢,因此编译器会为您生成另一个指令序列,以更高效的方式实现同样的功能

伪指令主要是为了方便人们编写汇编代码,使代码更易于阅读/编写/维护。与人类不同的是,编译器不会因为一遍又一遍地重复相同的任务而感到疲劳,因此也不需要像那样的便利

TL;DR:编译器将生成它认为最好的(根据当前的优化级别)指令序列。另外,
LDR
的特定形式是一条伪指令,因此即使禁用了所有优化,也可能无法让编译器生成它

当我通过编译器与它交叉检查时,它给出了不同的结果mov和mov

在我看来,您似乎是使用针对AArch32的编译器编译了C代码,但您显示的汇编代码似乎是为AArch64编写的。 以下是我使用ARM64 GCC 5.4和优化级别O3编译时得到的结果(我添加了注释):

如何在c中创建ldr

在这种情况下,我看不出有什么好的理由让编译器生成
LDR

LDR reg,=value
是一条伪指令,允许您加载不能直接在指令字中编码的即时指令。汇编程序通过将值(例如,
0x200018
)放在a中,然后用该文本池中的PC相对负载替换
ldr w0,=0x200018
(例如,
ldr w0,[PC,#offset_to_value]
)。访问内存的速度很慢,因此编译器会为您生成另一个指令序列,以更高效的方式实现同样的功能

伪指令主要是为了方便人们编写汇编代码,使代码更易于阅读/编写/维护。与人类不同的是,编译器不会因为一遍又一遍地重复相同的任务而感到疲劳,因此也不需要像那样的便利


TL;DR:编译器将生成它认为最好的(根据当前的优化级别)指令序列。另外,
LDR
的特定形式是一条伪指令,因此即使禁用所有优化,也可能无法让编译器生成它。

@Lundin:我的评论不正确。我不知怎的错过了结尾处的
str
。@Michael,你能解释一下第三条指令“str w0,[x1]”吗?Michael啊,我也是。由于编辑上的一些失误,它最后变成了一条评论。现在问题已经恢复。@BasavarajaMS是你的目标硬件苹果A9吗?@Lundin:我的评论不正确。我不知怎的错过了结尾处的
str
。@Michael,你能解释一下第三条指令“str w0,[x1]”吗?Michael啊,我也是。由于编辑上的一些失误,它最后变成了一条评论。问题现在已经恢复。@BasavarajaMS您的目标硬件是苹果A9吗?
    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]