помогите с ошибкой и построением программы

Пробую написать мини сервер. компиляция.

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 не правильно написано судя по ошике, но в другой программе почти также написано и всё нормально.


Ответы (0 шт):