Gcc 汇编程序模板,ASMSYMBOLCNAME和;错误:应为字符串文字“0”;

Gcc 汇编程序模板,ASMSYMBOLCNAME和;错误:应为字符串文字“0”;,gcc,assembly,Gcc,Assembly,我试图像微软的汇编程序一样使用GCC的扩展ASM。在Microsoft的MASM下,我们可以执行以下操作,其中\uu FUNC是一个C变量: mov eax, __FUNC 根据§6.44.3.1输入操作数: 操作数由逗号分隔。每个操作数都有以下格式: [ [asmSymbolicName] ] constraint (cexpression) [ [asmSymbolicName] ] constraint (cexpression) 符号名称 指定操作数的符号名。通过将名称括在方

我试图像微软的汇编程序一样使用GCC的扩展ASM。在Microsoft的MASM下,我们可以执行以下操作,其中
\uu FUNC
是一个C变量:

mov eax, __FUNC
根据§6.44.3.1输入操作数:

操作数由逗号分隔。每个操作数都有以下格式:

 [ [asmSymbolicName] ] constraint (cexpression)
[  [asmSymbolicName]  ] constraint (cexpression)
符号名称

指定操作数的符号名。通过将名称括在方括号中引用汇编程序模板中的名称(即“%[Value]”)。名称的范围是包含定义的asm语句。任何有效的C变量名都是可以接受的,包括已在周围代码中定义的名称

当我尝试在代码中使用它时:

unsigned int func = 1;
...

__asm__ __volatile__ (
  "movl %[__FUNC], %%eax"
  ...

  :
  : __FUNC "" (func)
);
其结果是:

cpu.cpp:148:5: error: expected string-literal before ‘__FUNC’
 : __FUNC "" (func)
   ^
cpu.cpp:148:5: error: expected ‘(’ before ‘__FUNC’
cpu.cpp:148:17: error: ‘__FUNC’ was not declared in this scope
...
据我所知,我正在使用
\uuu FUNC
,这是根据手册及其对
asmmycname
的描述。但显然我没有,因为有一个错误

我做错了什么


我还尝试了以下方法,因为手册告诉我可以在周围的代码中使用变量名,但也不起作用:

"movl %[func], %%eax"
...

:
: func "" (func)
以及:

这是正确的:

操作数由逗号分隔。每个操作数都有以下格式:

 [ [asmSymbolicName] ] constraint (cexpression)
[  [asmSymbolicName]  ] constraint (cexpression)
然而,
[asmsymaginame]
意味着
asmsymaginame
被方括号括起来
[
]
(外括号表示它是一个可选参数)。你可能会这样做:

uint32_t func = 1;
uint32_t result;

__asm__ __volatile__ (
    "movl %[func], %[result]"
    : [result]"=a"(result)
    : [func]"g"(func)
);
这将采用
func
的输入参数,使其在汇编程序模板中作为名为
func
的符号名可用。输出参数为
eax
(可写),符号名为
result
eax
完成后将存储在C变量
result
中。我选择了“g”,因为任何立即值、内存地址或寄存器都适合
movl
中的源代码。您可以通过以下方式传递即时值而不是“C”变量:

: [func]"g"(42)

另见。由于没有人指出asmSymbolicName使用中的明显错误,我将把它作为编译器驱动程序或文档错误来写。我想说的更多的是文档问题。是的,就是这样。希望GCC人员能够改进与此相关的文档。如果我只使用操作数将
asmsymorganicname
映射到
cexpression
(对于准MASM风格的内联汇编),那么它们显示在输入或输出操作数中是否重要?我发现,如果我遵循输入和输出操作数的约定,那么我必须在输出约束中使用
“=”
,这可能与我提供的代码重复。根据GCC,所有输出约束都需要具有相等的修饰符,根据您不想写入输入操作数的程序集模板文档(除非输出操作数也与之绑定)。文档中有这样一句话:“不要修改纯输入操作数的内容(与输出绑定的输入除外)。编译器假定在asm语句退出时,这些操作数包含与执行该语句之前相同的值”