从程序集调用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 << endl
( main
第一行)。 当你删除它时, show_number
的cout
似乎由于某种原因导致段错误。
是什么导致这个?
(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
一定要阅读完整的答案,但……