问题
This is a weird issue that I can't seem to find an answer to. This:
#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
}
}
actually works fine, except when you remove the initial cout << endl
(first line of main
). When you remove it, the cout
in show_number
seems to cause a segfault for some reason.
What causes this?
(OSX Mavericks x64, but should work in linux as well I think)
回答1:
The Mac OS X ABI requires a 16-bytes stack alignment, before calling a function.
If your code is working, you're simply lucky, and this explains why you're getting e segmentation fault when modifying previous sections of the code.
So you need to ensure the stack is aligned on a 16-byte boundary.
I already answered a similar question a few times ago:
How to print argv[0] in NASM?
The interesting part is:
; Align stack on a 16 bytes boundary
mov ebp, esp
and esp, 0xFFFFFFF0
Be sure to read the full answer, though...
来源:https://stackoverflow.com/questions/23136530/call-c-c-function-from-assembly-osx-mavericks-x64