1

我正在尝试使用 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它同时用作inout参数)

编译器生成错误:

../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 手册中的示例,但我无法找出问题所在。

4

1 回答 1

3

中的约束"[xn]"实际上[xn] "[xn]" (n)没有任何意义。使用参数名称或编号作为约束意味着“将此操作数放在与命名操作数相同的位置”。所以在这种情况下,你告诉 GCC 放在[xn]与 相同的位置[xn],这是没有意义的,实际上并没有提供有关操作数类型的信息。

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

于 2012-05-23T16:58:07.673 回答