这是一个奇怪的问题,我似乎找不到答案。这:
#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
)。当您删除它时,cout
在show_number
似乎由于某种原因导致了段错误。
这是什么原因造成的?
(OSX Mavericks x64,但我认为也应该在 Linux 中工作)
最佳答案
在调用函数之前,Mac OS X ABI 需要 16 字节堆栈对齐。
如果您的代码可以正常工作,那么您很幸运,这解释了为什么您在修改代码的前面部分时会遇到 e 段错误。
因此您需要确保堆栈在 16 字节边界上对齐。
我之前已经回答过类似的问题了几次:
有趣的部分是:
; 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/