インラインアセンブリの__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]