我正在尝试使用clang构建tinymembench,并在汇编代码中遇到错误。我可以修复简单的错误(删除.func / .endfunc的错误),但是在add和sub上出现的“指令操作数不明确”错误超出了我的最低汇编技巧。我在存储库中发布了一个问题,但有可能不再被维护。
使用此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,它们看起来很相似,但是我无法将其翻译成这些说明的答案。
答案 0 :(得分:2)
我可以修复简单的文件(删除.func / .endfunc的文件)
.func
宏包括一个.set SRC, rsi
,它根据适当的调用约定(x86-64 System V,Windows x64或带有堆栈args的32位)定义寄存器。
删除它只会留下未定义的SRC
符号,该符号当然会被视为内存操作数。 (而且add mem, imm
都没有隐含操作数大小的操作数,因此模棱两可。)
您的“修复程序”引入了此错误。
使用clang -no-integrated-as
来使用系统汇编程序,而不是clang的内置汇编程序。正如预期的那样,在我的Linux桌面上使用clang7.0.1可以很好地构建https://github.com/letrout/tinymembench/blob/master/x86-sse2.S。 (并且系统汇编程序= GNU Binutils as
2.31.1)