2016-06-10 129 views
2

轉儲彙編代碼功能的系統調用:理解彙編代碼

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> 

彙編轉儲結束。

有人可以告訴我發生了什麼行(0x00007f2db202a3c7 <syscall+23>: syscall

回答

1

這是由「系統V x86_64的調用約定」到「Linux的系統調用調用約定」轉換上面。

當您調用syscall函數時,編譯器將其視爲常規函數,並使用System V x86_64 calling conventions來傳遞參數。參數按以下順序傳遞:rdi,rsi,rdx,rcx,r8,r9,堆棧。但是對於系統調用的調用約定是不同的(參見syscall(2)):系統調用編號進入rax,參數進入rdi,rsi,rdx,r10,r8,r9。因此,syscall將一種通話慣例轉換爲另一種:

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