在函数调用在Mac和Linux上导致不同行为之前,GNU C基本asm堆栈推送

时间:2019-03-27 10:46:36

标签: assembly x86 inline-assembly

我正在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有什么问题。 谢谢。

0 个答案:

没有答案