【发布时间】: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,因为生成的代码不会有任何差异。