内联汇编的__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会生成一个可以运行的可执行文件。
它仍然会产生如下警告。
警告:不支持 MS 样式的内联汇编 [-Wmicrosoft]