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

Posted

技术标签:

【中文标题】这个 GCC 内联汇编中的参数列表有啥问题?【英文标题】:What is wrong with the parameters list in this GCC inline assembly?这个 GCC 内联汇编中的参数列表有什么问题? 【发布时间】:2012-05-23 15:41:12 【问题描述】:

我正在尝试使用 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 同时作为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 manual 中的示例,但我无法找出问题所在。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢。所以,如果我理解正确的话,第二个参数(xi)的"[xj]" 只编译b/c [xj] 之前被定义为"=r"?这就说得通了。但是,如果您查看我链接到的手册页,有一个示例(在文本“从 GCC 版本 3.1 开始”之后),其中 old 变量被分配了约束 "[result]" w/o 这被定义为以前的一种类型。这是如何工作的? 从 GCC 版本 3.1 开始,可以写 [name] 而不是匹配约束的操作数编号。例如:asm ("cmoveq %1,%2,%[result]" : [result] "=r"(result) : "r" (test), "r"(new), "[result]"(old)); OOOPPPSSS...我的错误 - 我没有在输出列表中看到 result 的实例。

以上是关于这个 GCC 内联汇编中的参数列表有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

GCC 内联汇编错误:变量 '%al' 的 asm 说明符与 asm clobber 列表冲突

为内联汇编参数打开立即值传播的特定 GCC 标志是啥?

GCC 内联汇编的副作用

GCC 内联汇编中的标签

gcc 内联汇编中的 min

GCC内联汇编中的C数组?