помогите с ошибкой и построением программы
Пробую написать мини сервер. компиляция.
all:
nasm -f elf64 server.asm -o server.o
gcc server.o -no-pie -o test
пишет ошибки.
nasm -f elf64 server.asm -o server.o
server.asm:61: error: invalid effective address
server.asm:63: error: invalid effective address
server.asm:110: error: parser: instruction expected
make: *** [makefile:2: all] Error 1
вот код сервера.
global main
extern socket
extern setsockopt
extern bind
extern listen
extern read
extern perror
extern exit
PF_INET equ 2
SOL_SOCKET equ 1
SO_REUSEPORT equ 15
SOCK_STREAM equ 1
SIZE_SOCKADDR_IN equ 14
section .text
main:
push rbp
mov rbp, rsp
sub rsp, 8
; 4 sock [rbp + 0]
; 4 optval [rbp + 4]
xor rax, rax
mov rdi, PF_INET
mov rsi, SOCK_STREAM
mov rdx, 0
call socket
cmp rax, 0
jg set_option_socket_reuse_port
error_socket:
lea rdi, [error_socket_string]
call perror
xor rax, rax
mov rdi, 1
jmp exit_program
set_option_socket_reuse_port:
mov [rbp + 0], eax ; sock
xor rax, rax
xor rdi, rdi
xor rsi, rsi
xor r10, r10
mov [rbp + 4], dword 1 ; optval
mov edi, [rbp + 0] ; sock
mov esi, SOL_SOCKET
mov edx, SO_REUSEPORT
lea r10, [rbp + 4] ; optval
mov r8, 4
call setsockopt
cmp rax, 0
je bind_socket
error_set_option_reuseport:
lea rdi, [error_socket_opt_reuseport]
call perror
jmp exit_program
bind_socket:
xor rax, rax
mov ax, [server_port]
xchg al, ah
mov [ss + sockaddr_in.port], ax
mov rdi, rax
lea rsi, [ss]
mov rdx, SIZE_SOCKADDR_IN
xor rax, rax
call bind
cmp rax, 0
je listen_socket
error_bind_socket:
lea rdi, [error_socket_bind]
call perror
jmp exit_program
listen_socket:
xor rax, rax
xor rdi, rdi
mov edi, [rbp + 0] ; sock
mov rsi, 0
call listen
cmp rax, 0
je accept_client
error_listen_socket:
lea rdi, [error_socket_listen]
call perror
jmp exit_program
accept_client:
exit_program:
call exit
leave
ret
section .rodata
; -------------- сообщения об ошибках -----------------------
error_socket_string db 'Не удалось открыть сокет', 0x0
error_socket_opt_reuseport db 'Не удалось установить опцию для сокета SO_REUSEPORT', 0x0
error_socket_bind db 'Не удалось привязать сокет', 0x0
error_socket_listen db 'Не удалось задать параметр для прослушивания', 0x0
; -------------- глобальные переменные, которые легко искать ----------
server_port dd 8020
section .data
; -------------- определения структур ----------------------
struc sockaddr_in
.family resw 1
.port resw 1
.s_addr resd 1
.data resb 8
endstruc
; -------------- структуры ----------------------------------
ss istruc sockaddr_in
at sockaddr_in.family, dw PF_INET
at sockaddr_in.port, dw 0
at sockaddr_in.s_addr, dd 0
at sockaddr_in.data, db 0
iend
почему то ss не правильно написано судя по ошике, но в другой программе почти также написано и всё нормально.