gpt4 book ai didi

c - 如何在 ARM 内联汇编程序中使用特定寄存器

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:44 26 4
gpt4 key购买 nike

我试图让内联汇编程序将一些值复制到特定的寄存器中,但它只会提示。这是将触发错误的代码的简短版本:

asm("" :: "r0" (value));
asm("" :: "a1" (value));

两条线都会触发:

Error: matching constraint references invalid operand number

那么如何指定寄存器直接取呢?我知道我可以为值引入名称,然后自己复制它们,但我想避免这种情况,因为这段代码会更短且更易读。

我为什么要问目前我正在处理一些系统调用。我想像这样使用系统调用宏:

#define SYSCALL0(NUMBER) asm("swi #" STRINGIFY(NUMBER));
#define SYSCALL1(NUMBER, A) asm("swi #" STRINGIFY(NUMBER) :: "r0"(A));
#define SYSCALL2(NUMBER, A, B) asm("swi #" STRINGIFY(NUMBER) :: "r0"(A), "r1"(B));
...

如您所见,这非常适合在线。当然我可以这样做:

#define SYSCALL1(NUMBER, A) register type R0 asm("r0") = A;
SYSCALL0(NUMBER)

但是我必须将 A 转换为 type 才能避免类型错误或每次type > 我在不同的函数中使用宏。

最佳答案

有了 GCC,有一个捷径:

register long r0 asm ("r0");

然后r0注册的“别名”。

将其与 statement expression 结合起来,你甚至可以获得 r0 作为“返回值”。

#define SYSCALL1(NUMBER,A) ({\
register long r0 asm("r0") = (long) (A); \
asm("swi #" STRINGIFY(NUMBER) : "=r"(r0) : "r"(r0) : "memory"); \
r0; })

(我不知道 clobber 是否合法,不过 uClibc 系统调用实现有这个。)

参见 extended assemblylocal reg vars .

关于c - 如何在 ARM 内联汇编程序中使用特定寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10831792/

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