Tôi muốn kiểm tra mã để thực hiện các cuộc gọi hệ thống trong glibc. Tôi tìm thấy một cái gì đó như thế này.Syscall có phải là hướng dẫn trên x86_64 không?
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. */
Bây giờ câu hỏi của tôi là nếu syscall (trước lệnh cmpq
) là hướng dẫn? Thứ hai, nếu nó là một chỉ dẫn, ý nghĩa của ENTRY (syscall) là gì? Cùng tên cho ENTRY (Tôi không biết ENTRY là gì) và chỉ dẫn? Thứ hai, L là gì (pseudo_end)?
Đó là. Nó giống như 'int 0x80' trong x86. – Dave
Lưu ý rằng mã chuyên dùng thông thường được sử dụng cho mỗi cuộc gọi hệ thống, để đặt '% rax' từ hằng số (lưu một thanh ghi) và bỏ qua thiết lập các đối số không được sử dụng. – o11c