理解函数系统调用的汇编代码

时间:2016-06-10 11:22:32

标签: linux-kernel

转储函数系统调用的汇编代码:

aFunc

汇编程序转储结束。

有人可以告诉我在行(0x00007f2db202a3b0 <syscall+0>: mov %rdi,%rax 0x00007f2db202a3b3 <syscall+3>: mov %rsi,%rdi 0x00007f2db202a3b6 <syscall+6>: mov %rdx,%rsi 0x00007f2db202a3b9 <syscall+9>: mov %rcx,%rdx 0x00007f2db202a3bc <syscall+12>: mov %r8,%r10 0x00007f2db202a3bf <syscall+15>: mov %r9,%r8 0x00007f2db202a3c2 <syscall+18>: mov 0x8(%rsp),%r9 0x00007f2db202a3c7 <syscall+23>: syscall 0x00007f2db202a3c9 <syscall+25>: cmp $0xfffffffffffff001,%rax 0x00007f2db202a3cf <syscall+31>: jae 0x7f2db202a3d2 <syscall+34> 0x00007f2db202a3d1 <syscall+33>: retq 0x00007f2db202a3d2 <syscall+34>: mov 0x28fbbf(%rip),%rcx #0x7f2db22b9f98 0x00007f2db202a3d9 <syscall+41>: xor %edx,%edx 0x00007f2db202a3db <syscall+43>: sub %rax,%rdx 0x00007f2db202a3de <syscall+46>: mov %edx,%fs:(%rcx) 0x00007f2db202a3e1 <syscall+49>: or $0xffffffffffffffff,%rax 0x00007f2db202a3e5 <syscall+53>: jmp 0x7f2db202a3d1 <syscall+33>

之上发生了什么

1 个答案:

答案 0 :(得分:1)

这是从“System V x86_64调用约定”到“linux系统调用调用约定”的转换。

当您调用syscall函数时,编译器会将其视为常用函数,并使用System V x86_64 calling conventions来传递参数。参数按以下顺序传递:rdi,rsi,rdx,rcx,r8,r9,stack。但是系统调用的调用约定是不同的(参见syscall(2)):系统调用号进入rax,参数进入rdi,rsi,rdx,r10,r8,r9。因此,syscall将一个调用约定转换为另一个调用约定:

rdi -> rax (syscall number)
rsi -> rdi (first argument)
rdx -> rsi (second argument)
...