【发布时间】:2019-08-01 18:40:05
【问题描述】:
我想写一个内联汇编函数,它会做乘法和移位,然后将结果转换为 32 位值,我需要它但不能使用任何,产生错误
我想用clobbers进行计算,然后返回结果
static inline int32_t multi(int32_t in0, int32_t in1)
{
int32_t res=0;
asm volatile ( "add.n r3 , %1 ,%1\n"
"mull %0, %2 , r3\n"
:"=r"(res)
: "r"(in0), "r"(in1)
:"cc","r3");
return res;
}
它正在产生以下错误,
错误:“asm”中的未知寄存器名称“r3”
我尝试了很多寄存器,如 a1 a2 等,但似乎没有任何效果,我在上面的代码中是否犯了一些愚蠢的错误
【问题讨论】:
-
您为哪种架构编程?
-
请注意,编译器可能非常有能力从简单的 C 代码生成算术指令。确保它不是过早的优化。
-
我不认识这里的拱门,但我想知道你是否可以这样做:
"add.n %0 , %1 ,%1\n mull %0, %2 , %0\n"?使用更少的寄存器,并且不需要clobber。 -
我没有找到专门为此的文档,但我发现的一些 xtensa 示例使用以“a”开头的寄存器名称(即 a3)。如果做不到这一点,请尝试在您的 2 个 asm 行前加上注释标记,然后使用 -S 编译以查看为 %0、%1 等生成的汇编程序。
-
嗯,好吧,你去。总结一下,我应该提一下,(正确地)使用内联 asm 真的很难,通常是bad idea。是的,它很强大,是的,它具有教育意义,但对于生产代码来说几乎总是一个坏主意。
标签: c assembly inline-assembly