Почему я получаю EACCES после вызова привязки сокетов в NASM linux x64
Мой код ниже. Я могу получить fd=3 в sys_socket, но не могу пройти через sys_bind из-за errno=EACCES. Я не знаю почему, так как я проверил регистры и данные памяти в my_sa. Не могли бы вы дать мне несколько советов? Большое спасибо.
global _start
struc sockaddr_in
.sin_family resw 1
.sin_port resw 1
.sin_addr resd 1
.sin_zero resb 8
endstruc
; Convert numbers (constants!) to network byte order
%define htonl(x) ((x & 0xFF000000) >> 24) | ((x & 0x00FF0000) >> 8) | ((x & 0x0000FF00) << 8) | ((x & 0x000000FF) << 24)
%define htons(x) ((x >> 8) & 0xFF) | ((x & 0xFF) << 8)
AF_INET equ 2
SOCK_STREAM equ 1
INADDR_ANY equ 0 ; /usr/include/linux/in.h
IP equ htonl(INADDR_ANY)
PORT equ htons(80)
STDIN equ 0
STDOUT equ 1
section .data
my_sa: istruc sockaddr_in
at sockaddr_in.sin_family, dw AF_INET
at sockaddr_in.sin_port, dw PORT
at sockaddr_in.sin_addr, dd INADDR_ANY
at sockaddr_in.sin_zero, dd 0, 0 ; for struct sockaddr
iend
section .text
_start:
mov rax, 41 ; system call sys_socket
mov rdi, AF_INET ; AF_INET
mov rsi, SOCK_STREAM ; SOCK_STREAM
xor rdx, rdx ; INADDR_ANY=0
syscall ; rax contains sockfd
mov rdi, rax ; sockfd
mov rax, 49 ; system call sys_bind
mov rsi, my_sa ; address of struct sockaddr my_sa
mov rdx, sockaddr_in_size ; sizeof(my_sa)
syscall ; on success, rax is 0