x86_64 寄存器传参方式

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

# 验证代码

1
2
3
4
# 环境
├── arg.bt
├── arg_test
└── hello.c
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 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);
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 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);
}

# 执行结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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

Licensed under CC BY-NC-SA 4.0
Hello, World!
使用 Hugo 构建
主题 StackJimmy 设计