如何创建具有多变量寄存器偏移量的内联汇编命令?

问题描述 投票:0回答:1

以下代码使用 ARMv4 的 gcc,完全没问题:

asm("strb.w r2, [r0, #24 + 8 * 1]");

现在,如果我尝试以下操作:

asm("strb.w r2, [r0, %[offset] + %[delta] * %[scale]]"
    :: [offset] "i" (24), [delta] "i" (8), [scale] "i" (1)
);

我明白了

strb.w r2, [r0, #24 + #8 * #1]

这显然是错误的。我怎样才能做到这一点?

asm("strb.w r2, [r0, #24 + 8 * 1]");
gcc arm inline-assembly
1个回答
0
投票

将评论变成答案,因为它似乎有效:

查看内联asm的gcc文档,我们看到有一个可以用于“i”的修饰符。添加

c
将:

需要一个常量操作数并打印不带标点符号的常量表达式。

因此,将您的代码更改为这样的代码应该可以满足您的需求:

asm("strb.w r2, [r0, %[offset] + %c[delta] * %c[scale]]"
    :: [offset] "i" (24), [delta] "i" (8), [scale] "i" (1)
);

顺便说一句:虽然这可能会满足您的需求,但作为一般规则,我建议您不要使用内联汇编(尽管它多么强大和酷)。显然我不知道您的具体要求,但有充分的理由尽可能避免内联汇编。

© www.soinside.com 2019 - 2024. All rights reserved.