2016-06-10 5 views
2

Dump von Assembler-Code für die Funktion syscall:Verständnis Assembler-Code für die Funktion syscall

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> 

Ende des Assembler-Dump.

kann mir jemand sagen, was über der Linie geschieht (0x00007f2db202a3c7 <syscall+23>: syscall)

Antwort

1

Dies ist die Umwandlung von „System V x86_64 Aufrufkonventionen“ auf „Linux-Systemaufruf Aufrufkonventionen“.

Wenn Sie die Funktion syscall aufrufen, behandelt der Compiler die Funktion wie üblich und verwendet System V x86_64 calling conventions zum Übergeben von Argumenten. Argumente werden in der folgenden Reihenfolge übergeben: rdi, rsi, rdx, rcx, r8, r9, Stapel. Die Aufrufkonventionen für Systemaufrufe sind jedoch unterschiedlich (siehe syscall(2)): Die Systemaufrufnummer wird in Rax eingegeben, und die Argumente gehen in rdi, rsi, rdx, r10, r8, r9. So wandelt syscall eine Aufrufkonvention in eine andere um:

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