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

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

#include <iostream>
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(主要的第一行).当你删除它时,show_number中的cout似乎由于某种原因导致段错误. 是什么导致这个? (OSX Mavericks x64,但我认为应该在linux中工作)

最佳答案
在调用函数之前,Mac OS X ABI需要16字节的堆栈对齐.

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

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

How to print argv[0] in NASM?

有趣的是:

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

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

转载注明原文:从程序集调用C/C++函数(OSX Mavericks x64) - 代码日志