x86_64 寄存器传参方式

·1min·李岩

x86_64 架构下,寄存器传参时,仅 arg1-arg6 会通过寄存器进行,arg7+ 的参数,将会放到栈上进行。

验证代码

# 环境
├── arg.bt
├── arg_test
└── hello.c
// hello.c, gcc -o arg_test hello.c
#include <stdio.h>
#include <stdlib.h>

void print_arg(int arg1, int arg2, int arg3, int arg4, int arg5, int arg6,
               int arg7, int arg8){
    printf("%d, %d, %d, %d, %d, %d, %d, %d
", arg1, arg2, arg3, arg4, arg5,
           arg6, arg7, arg8);
    return;
}

int main(){
    print_arg(1,2,3,4,5,6,7,8);
}
// arg.bt
#!/bin/bpftrace

uprobe:./arg_test:print_arg
{
    printf("== enter print_arg
");
    printf("arg1: %d
", arg0);
    printf("arg2: %d
", arg1);
    printf("arg3: %d
", arg2);
    printf("arg4: %d
", arg3);
    printf("arg5: %d
", arg4);
    printf("arg6: %d
", arg5);
    printf("arg7: %d
", sarg0);
    printf("arg8: %d
", sarg1);
}

执行结果

sudo bpftrace arg.bt
Attaching 1 probe...
== enter print_arg
arg1: 1
arg2: 2
arg3: 3
arg4: 4
arg5: 5
arg6: 6
arg7: 7
arg8: 8

./arg_test

参照

X86 64 Register and Instruction Quick Start