我得到了以下 2 个定义,使用 XCode LLVM-GCC 编译器可以很好地编译(和工作):
#define SAVE_STACK(v)__asm { mov v, ESP }
#define RESTORE_STACK __asm {sub ESP, s }
然而,当我将编译器更改为 Apple LLVM 时,出现以下错误:
Expected '(' after 'asm'
我用 () 替换了 {} 但这没有用,我在谷歌上搜索那个错误找不到任何有用的东西......有人吗?
最佳答案
内联汇编的 __asm {...}
风格是非标准的,不被 clang 支持。相反,C++ 将内联汇编语法指定为 asm("...")
,请注意引号。 clang 还使用 AT&T 汇编语法,因此需要重写宏以确保安全。
但是,一些工作一直在进行,以改进对 Microsoft 的非标准汇编语法以及 Intel 风格的汇编的支持。有一个选项 -fenable-experimental-ms-inline-asm
可以启用到目前为止所做的事情,尽管我不确定它是何时引入的,也不确定 clang 版本的支持有多好正在使用。对您显示的代码进行的简单尝试似乎适用于来自 SVN 主干的最新版本的 clang。
#define SAVE_STACK(v)__asm { mov v, ESP }
#define RESTORE_STACK __asm {sub ESP, s }
int main() {
int i;
int s;
SAVE_STACK(i);
RESTORE_STACK;
}
clang++ tmp.cpp -fms-extensions -fenable-experimental-ms-inline-asm -S -o -
.def main;
.scl 2;
.type 32;
.endef
.text
.globl main
.align 16, 0x90
main: # @main
# BB#0: # %entry
pushq %rax
#APP
.intel_syntax
mov dword ptr [rsp + 4], ESP
.att_syntax
#NO_APP
#APP
.intel_syntax
sub ESP, dword ptr [rsp]
.att_syntax
#NO_APP
xorl %eax, %eax
popq %rdx
ret
命令 clang++ tmp.cpp -fms-extensions -fenable-experimental-ms-inline-asm 生成可运行的可执行文件。
不过它仍然会产生如下警告。
warning: MS-style inline assembly is not supported [-Wmicrosoft]
关于c++ - XCode 中的 LLVM-GCC ASM 到 LLVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13301371/