【问题标题】:clang assembler error: ambiguous operand size for instructionclang 汇编器错误:指令的操作数大小不明确
【发布时间】:2019-05-02 03:04:13
【问题描述】:

我正在尝试使用 clang 构建 tinymembench,并且在汇编代码中遇到错误。我可以修复简单的问题(删除 .func/.endfunc's),但是 add 和 sub 上的“指令操作数不明确”错误超过了我的最低汇编技能。我在 repo 上发布了一个问题,但它可能不再被维护。

使用这个 source file(删除 .func/.endfunc)我得到如下错误:

$ clang-8 x86-sse2.S /tmp/x86-sse2-dbaa71.s:86:9: error: ambiguous operand size for instruction 'add' add SRC, 64 ^~~ /tmp/x86-sse2-dbaa71.s:87:9: error: ambiguous operand size for instruction 'add' add DST, 64 ^~~ /tmp/x86-sse2-dbaa71.s:88:9: error: ambiguous operand size for instruction 'sub' sub SIZE, 64 ^~~~ ...

我查看了this answer,它看起来很相似,但我无法将其翻译成这些说明的答案。

【问题讨论】:

  • .set SRC, rsi#ifdef __amd64__ 中。看起来clang没有这样做?它应该是一个暗示操作数大小的寄存器,但这些错误消息看起来像是 clang 假设它是一个符号作为内存操作数。 这些真的是您收到的第一条错误消息吗?我从 clang 7.0 收到 <instantiation>:2:1: error: unknown directive .func aligned_block_copy_movsb
  • @PeterCordes:clang 没有自己的汇编器,是吗?我假设这是由系统汇编程序处理的,它的行为可能与编写代码的汇编程序不同?或者,预处理器设置的宏可能与预期不同。
  • @NateEldredge:clang 确实有它自己的内置汇编器,我猜这样即使对于包含内联汇编的 C,它也可以避免通过系统汇编器。您可以使用-no-integrated-as 禁用它。
  • 在下次发帖之前先检查一下markdownguide.org/getting-started
  • @PeterCordes:好的,很有趣。一个简单的解决方法可能是为汇编文件返回 gas,因为生成的代码不会有任何差异。

标签: assembly clang


【解决方案1】:

我可以修复简单的(删除 .func/.endfunc 的)

.func 宏包含一个 .set SRC, rsi,它根据适当的调用约定(x86-64 System V、Windows x64 或带堆栈参数的 32 位)定义寄存器。

删除它只会留下一个未定义的SRC 符号,它当然被视为内存操作数。 (并且add mem, imm 没有暗示操作数大小的任何一个操作数,所以它是模棱两可的。)

您的“修复”引入了这个错误。


使用clang -no-integrated-as 来使用系统汇编程序而不是clang 的内置汇编程序。 正如预期的那样,在我使用clang7.0.1 的Linux 桌面上构建https://github.com/letrout/tinymembench/blob/master/x86-sse2.S 就好了。 (和系统汇编程序 = GNU Binutils as 2.31.1)

【讨论】:

  • 'clang -no-integrated-as' 对我有用,谢谢。我怀疑我以某种方式错过了 .set 调用,但看起来代码中早先引用了那些 not 引发错误的符号,这让我偏离了轨道。
  • @letrout:GAS 语法不需要声明未知符号(如 NASM extern printf)。您可以只使用call printf,它会在目标文件中为该符号发出重定位。或mov rdi, [stdout] 加载全局FILE* 变量。显然,对于像 SRC 这样未在任何地方定义的符号,您会遇到链接错误,但在 GAS 样式的 asm 中使用未声明的符号并不是错误。 (无论如何,如果这回答了您的问题,您可以使用投票箭头下方的复选框将其标记为已接受。)
猜你喜欢
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多