我正在尝试使用GCC的扩展asm语法嵌入以下汇编指令(类似ARM的架构):
__asm__("lsr %[xj], %[xj], %[xn]" :
[xj] "=r" (j) :
[xi] "[xj]" (j) , [xn] "[xn]" (n)); // j = j >> n
i
,j
和n
被声明为整数int i, j, n;
(请注意,j
同时用作和 out 参数中的
编译器生成错误:
../src/fft2dlib.c:55:5: error: matching constraint references invalid operand number
../src/fft2dlib.c:53:3: error: matching constraint references invalid operand number
其中第53行和第55行是上述asm代码的第一行和第三行。
当我在汇编指令中用显式常量替换n
输入参数时,它编译得很好:
__asm__("lsr %[xj], %[xj], 27" :
[xj] "=r" (j) :
[xi] "[xj]" (j)); // j = j >> 27
我正在关注GCC manual中的示例,但我无法弄清楚问题。
答案 0 :(得分:3)
"[xn]"
中的约束[xn] "[xn]" (n)
并没有多大意义。使用参数名称或数字作为约束意味着“将此操作数放在与指定操作数相同的位置”。因此,在这种情况下,您告诉GCC将[xn]
放在与[xn]
相同的位置,这是毫无意义的,并且实际上并未提供有关操作数类型的信息。
您需要使用另一个约束类型,例如"r"
作为寄存器操作数,具体取决于汇编指令允许的内容。