ARM代码到C语言的转换
这是我的A9的汇编代码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
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]