@
fractal314 不对. 我刚刚实际调试了下, 至少结构体是通过寄存器 /栈来传参数的. 而且 C 里边没有类这种东西 (当然你可以自己实现).
比如 x86_64 下这段代码
-------------------------------
#include <stdio.h>
typedef struct {
int i;
} S_t;
int test(S_t S)
{
printf("%d\n", S.i);
}
int main(int argc, char *argv[])
{
S_t S = {1};
test(S);
return 0;
}
-------------------------------
用 x86_64-unknown-linux-gnu-gcc 编译之后
0000000000400528 <main>:
push rbp
mov rbp,rsp
sub rsp,0x20
mov DWORD PTR [rbp-0x14],edi
mov QWORD PTR [rbp-0x20],rsi
mov DWORD PTR [rbp-0x10],0x1
mov eax,DWORD PTR [rbp-0x10]
mov edi,eax
call 400506 <test>
mov eax,0x0
leave
ret
nop
在 call test 的时候是直接传的值, 而不是引用 (地址). 因为 x86_64 前 6 个参数是通过 rdi, rsi, rdx, rcx, r8, and r9 来传参的. 这时的 info reg:
...
rdi 0x1 1
...
而 test 里边显然也是将 rdi 作为 printf 的第二个参数 (rsi):
push rbp
mov rbp,rsp
sub rsp,0x10
mov DWORD PTR [rbp-0x10],edi
mov eax,DWORD PTR [rbp-0x10]
mov esi,eax
mov edi,0x4005d4
mov eax,0x0
call 4003e0 <printf@plt>
nop
leave
ret