这个 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
i
、j
和 n
被声明为整数 int i, j, n;
(注意j
同时作为in 和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】:[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 内联汇编中的参数列表有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章