Я получил следующее определение, которое прекрасно компилируется (и работает) с использованием компилятора 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("...")
Обратите внимание на цитаты. Также лязг использует AT&Синтаксис T-сборки, поэтому макросы необходимо переписать для обеспечения безопасности.
Тем не менее, продолжается работа по улучшению поддержки нестандартного синтаксиса сборки Microsoft и сборки стиля Intel вместе с ней. Там есть вариант -fenable-experimental-ms-inline-asm
это позволяет сделать то, что было сделано до сих пор, хотя я не уверен, когда это было введено или насколько хороша поддержка в версии clang, которую вы используете. Простая попытка с кодом, который вы показываете, кажется, работает с недавней версией Clang из ствола SVN.
#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-экспериментальный-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-экспериментальный-ms-inline-asm создает исполняемый файл, который запускается
Это все еще производит предупреждения как следующее все же.
предупреждение: встроенная сборка в стиле MS не поддерживается [-Wmicrosoft]
У меня проблема с использованием среды разработки XCode, следующий код скомпилирован правильно. Переключаясь на мой make-файл, я получил следующее сообщение об ошибке 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