我正在x86平台上编写一个微型编译器。在Linux和Mac OS上测试内联汇编代码时,我发现此代码片段在这两个平台上具有不同的行为。
#include <iostream>
#include <vector>
#include <cassert>
using namespace std;
void ret() {
std::cout << "haha" << std::endl;
}
int main(int argc, char *argv[])
{
asm volatile ("sub $0x08, %rsp"); // on linux okay, but on macOS will SIGSEGV. After changing it to `asm volatile ("sub $0x10, %rsp");`, macOS platform behaves well.
asm volatile ("mov %r15, 0x0(%rsp)");
asm volatile ("mov %0, %%r10"::"r"((void*)ret));
asm volatile ("call *%r10");
asm volatile ("int $0x03");
}
在到达int3
软件断点之前发生故障。
我想保存(推送)一个r15寄存器以进行保存(尽管我知道它是被调用方保存的寄存器),我并不认为sub $0x08, %rsp
有什么问题。
谢谢。