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

标签 c++ c assembly posix abi

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

#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 (第一行 main )。当您删除它时,coutshow_number似乎由于某种原因导致了段错误。

这是什么原因造成的?

(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/C++ 函数 (OSX Mavericks x64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23136530/

相关文章:

c - 我的服务器无缘无故暂停,直到我杀死客户端

assembly - "mov offset(%rip), %rax"是做什么的?

c - 此时代码中 %esp 的值应该是多少?

c++ - 虚拟处理器和高级网络 linux 和 windows

c++ - 非 unicode 程序和注册表设置的语言

c++ - lambda 表达式转换

c++ - 无法迭代 Qt 枚举

c++ - 嵌套类名在封闭类模板中使用时是否被视为当前实例化

c - 如何通过 block 设备打开文件

c - 如何在 Windows 上安装 CUnit