【问题标题】:Assembler templates, asmSymbolicName and "error: expected string-literal"汇编器模板,asmSymbolicName 和“错误:预期的字符串文字”
【发布时间】:2023-03-19 01:20:01
【问题描述】:

我正在尝试使用 GCC 的扩展 ASM,例如 Microsoft 的汇编程序。在微软的 MASM 下,我们可以这样做,其中__FUNC 是一个 C 变量:

mov eax, __FUNC

根据Extended Asm - Assembler Instructions with C Expression Operands, § 6.44.3.1 输入操作数

操作数用逗号分隔。每个操作数的格式如下:

 [ [asmSymbolicName] ] constraint (cexpression)

asmSymbolicName

     指定操作数的符号名称。通过将其括在方括号中来引用汇编程序模板中的名称(即“%[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
...

据我所知,我正在使用__FUNC 根据手册及其对asmSymbolicName 的描述。但显然我不是,因为有错误。

我做错了什么?


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

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

:
: func "" (func)

还有:

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

:
: func (func)
...

【问题讨论】:

标签: gcc assembly


【解决方案1】:

这是正确的:

操作数用逗号分隔。每个操作数的格式如下:

[  [asmSymbolicName]  ] constraint (cexpression)

但是[asmSymbolicName] 的意思是asmSymbolicName 被方括号[] 包围(外面的括号表示它是一个可选参数)。您可能一直在这样做:

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)

【讨论】:

  • 是的,就是这样。希望 GCC 人员会改进与此相关的文档。
  • 相关,如果我只使用操作数将 asmSymbolicName 映射到 cexpression(对于内联汇编的准 MASM 样式),那么它们是否出现在输入或输出操作数中是否重要?我发现,如果我遵循输入和输出操作数的约定,那么我必须在输出约束中使用"=",这可能会重复我提供的代码。
  • 根据 GCC docs 所有输出约束都需要有一个 equal 修饰符,
  • 根据汇编模板的文档,您不想写入输入操作数(除非输出操作数也与之相关联)。文档有这样的说法:“不要修改仅输入操作数的内容(与输出相关的输入除外)。编译器假定在从 asm 语句退出时,这些操作数包含与以前相同的值执行语句"
猜你喜欢
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2018-12-09
  • 2016-06-08
  • 1970-01-01
  • 2011-05-14
相关资源
最近更新 更多