我得到了以下两个使用XCode LLVM-GCC编译器编译(和工作)的定义:
#define SAVE_STACK(v)__asm { mov v, ESP }
#define RESTORE_STACK __asm {sub ESP, s }
然而,当我将编译器更改为Apple LLVM时,我收到以下错误:
Expected '(' after 'asm'
我将{}替换为()但是没有做到这一点,我谷歌上的错误找不到任何有用的东西......任何人?
答案 0 :(得分:3)
内联汇编的__asm {...}
样式是非标准的,clang不支持。相反,C ++将内联汇编语法指定为asm("...")
,请注意引号。 clang也使用AT& T汇编语法,因此需要重写宏以保证安全。
然而,一些工作一直在进行,以改进对微软非标准汇编语法和英特尔风格组件的支持。有一个选项-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 生成一个可运行的可执行文件。
它仍然会产生如下警告。
警告:不支持MS样式的内联汇编[-Wmicrosoft]
答案 1 :(得分:1)
我在使用XCode开发环境时遇到问题,以下代码编译正确。切换到我的makefile我收到以下错误消息Expected '(' after 'asm'
#define DebugBreak() { __asm { int 3 }; }
int main(int argc, const char *argv[])
{
DebugBreak();
}
请注意DebugBreak()
的定义来自我在Visual Studio下编译的代码。
我在make文件中修复此问题的方法是添加参数-fasm-blocks
CFLAGS += -std=c++11 -stdlib=libc++ -O2 -fasm-blocks