Ich wollte den Code zum Ausführen von Systemaufrufen in Glibc überprüfen. Ich habe so etwas gefunden.Ist syscall eine Anweisung auf x86_64?
ENTRY (syscall)
movq %rdi, %rax /* Syscall number -> rax. */
movq %rsi, %rdi /* shift arg1 - arg5. */
movq %rdx, %rsi
movq %rcx, %rdx
movq %r8, %r10
movq %r9, %r8
movq 8(%rsp),%r9 /* arg6 is on the stack. */
syscall /* Do the system call. */
cmpq $-4095, %rax /* Check %rax for error. */
jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */
L(pseudo_end):
ret /* Return to caller. */
Jetzt ist meine Frage, ob die syscall (vor dem cmpq
-Befehl) ist ein Befehl? Zweitens, wenn es eine Anweisung ist, was bedeutet ENTRY (syscall)? Der gleiche Name für einen Eintrag (ich weiß nicht, was ein Eintrag ist) und Anleitung? Zweitens, was ist L (pseudo_end)?
Es ist. Es tut dasselbe wie 'int 0x80' in x86. – Dave
Beachten Sie, dass normalerweise für jeden Systemaufruf spezialisierter Code verwendet wird, um '% rax' von einer Konstanten (Speichern eines Registers) zu setzen und nicht verwendete Argumente zu überspringen. – o11c