x86_64下 C C++ 函数调用时的参数传递方法

C C++函数调用时的参数传递方法根据架构、编译器的不同而有所不同,本文讲的是x86_64架构上使用C C++语言GNU编译器的情况。

先说结论:在x86_64上,整型和指针类型的参数会从左至右依次保存到rdi、rsi、rdx、rcx、r8、r9这6个寄存器,浮点参数会保存到xmm0、xmm1.....等寄存器中。当参数个数超过了这些寄存器的限制,多余的参数就会保存到栈上。

以下用一个例子验证,编写如下程序并编译:

#include 

void func(int a, long b, short c, char d, long long e,
          float f, double g,
          int* h, float* i, char* j)
{
    printf("func");
}

int main()
{
    int pint = 1;
    float pfloat = 0.01;
    char buf[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    func(250, 25000L, 10, 'F', 123456789LL, 3.14, 3.1415926e8, &pint, &pfloat, &buf[0]);

    return 0;
}

将以上程序编译得到test程序:

root-> g++ -c -pipe -g -Wall -Wextra -fPIC -o main.o ./main.c

root-> g++ -o test main.o

使用gdb运行程序并设置断点在func函数

你可能感兴趣的:(c语言,c++,linux,gdb,调试)