从程序集调用C / C ++函数(OSX Mavericks x64)

这是一个奇怪的问题,我似乎无法找到答案。 这个:

#include  using namespace std; void show_number(int number) { cout << number << endl; // Shows '10' as expected } int main() { cout << endl; // Remove this and it fails __asm { mov rdi, 10 call show_number } } 

实际上工作正常,除非你删除初始cout << endlmain第一行)。 当你删除它时, show_numbercout似乎由于某种原因导致段错误。

是什么导致这个?

(OSX Mavericks x64,但我认为应该在linux中工作)

在调用函数之前,Mac OS X ABI需要16字节的堆栈对齐。

如果您的代码正常工作,那么您很幸运,这就解释了为什么在修改代码的前一部分时出现e分段错误的原因。

因此,您需要确保堆栈在16字节边界上对齐。
几次我已经回答了类似的问题:

如何在NASM中打印argv [0]?

有趣的是:

 ; Align stack on a 16 bytes boundary mov ebp, esp and esp, 0xFFFFFFF0 

一定要阅读完整的答案,但……