gpt4 book ai didi

gcc - 如何在 ARM aarch64 GCC 内联汇编中使用 32 位 w 寄存器?

转载 作者:行者123 更新时间:2023-12-02 16:49:13 26 4
gpt4 key购买 nike

我可以使用 64 位寄存器,例如:

#include <assert.h>
#include <inttypes.h>

int main(void) {
uint64_t io = 1;
__asm__ (
"add %[io], %[io], 1;"
: [io] "+r" (io)
:
:
);
assert(io == 2);
}

编译和反汇编:

aarch64-linux-gnu-gcc -ggdb3 -o main.out main.c
gdb-multiarch -batch -ex 'disassemble/rs main' main.out

按预期到 64 位寄存器:

6           __asm__ (
0x0000000000000744 <+16>: a0 0f 40 f9 ldr x0, [x29, #24]
0x0000000000000748 <+20>: 00 04 00 91 add x0, x0, #0x1
0x000000000000074c <+24>: a0 0f 00 f9 str x0, [x29, #24]

如何使用w0等32位寄存器代替?

在 Ubuntu 18.04、GCC 7.4.0 上测试。

最佳答案

可以通过在%前面加上w来实现,例如:

#include <assert.h>
#include <inttypes.h>

int main(void) {
uint32_t io = 1;
__asm__ (
"add %w[io], %w[io], 1;"
: [io] "+r" (io)
:
:
);
assert(io == 2);
}

现在反汇编成所需的 32 位版本:

6           __asm__ (
0x0000000000000744 <+16>: a0 1f 40 b9 ldr w0, [x29, #28]
0x0000000000000748 <+20>: 00 04 00 11 add w0, w0, #0x1
0x000000000000074c <+24>: a0 1f 00 b9 str w0, [x29, #28]

这可能是从以下方面猜到的:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.100067_0612_00_en/qjl1517569411293.html因为 ARM 编译器 6 是基于 LLVM 的,而 LLVM 语法主要是基于 GCC。

关于gcc - 如何在 ARM aarch64 GCC 内联汇编中使用 32 位 w 寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59395244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com