这个GCC内联汇编中的参数列表有什么问题?

时间:2012-05-23 15:41:13

标签: c gcc assembly inline-assembly

我正在尝试使用GCC的扩展asm语法嵌入以下汇编指令(类似ARM的架构):

__asm__("lsr  %[xj], %[xj], %[xn]" : 
            [xj] "=r" (j) : 
            [xi] "[xj]" (j) , [xn] "[xn]" (n)); // j = j >> n

ijn被声明为整数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中的示例,但我无法弄清楚问题。

1 个答案:

答案 0 :(得分:3)

"[xn]"中的约束[xn] "[xn]" (n)并没有多大意义。使用参数名称或数字作为约束意味着“将此操作数放在与指定操作数相同的位置”。因此,在这种情况下,您告诉GCC将[xn]放在与[xn]相同的位置,这是毫无意义的,并且实际上并未提供有关操作数类型的信息。

您需要使用另一个约束类型,例如"r"作为寄存器操作数,具体取决于汇编指令允许的内容。