Как скомпилить NASM

Недавно задавал вопрос про ошибку сегментирования. Нашлись проблемы в коде, но их решения не дало результата. Полез в инет и понял, что любой онлайн IDE для 64 битного NASM-а компилит код без проблем (https://ideone.com/4lmPcD или https://tio.run/#assembly-nasm). Вопрос: почему у меня выдает ошибку?

nasm -f elf64 prog.asm ld -m elf_x86_64

NASM version 2.15.04
Kernel: x86_64 Linux 5.8.7-arch1-1

Код:

_strlen:
    
    push rdx
    xor rdx,rdx
    _strlen_loop_start:

        cmp  [rax+rdx] ,byte  0
        je _strlen_loop_end
        inc rdx
        jmp _strlen_loop_start

    _strlen_loop_end:
        mov rax,rdx
        pop rdx
        ret



_print:

    push rax
    push rbx
    push rcx
    push rdx
    mov rcx, rax
    
    call _strlen
    
    mov rdx,rax
    mov rax,4
    mov rbx,1
    int 80h

    pop rdx
    pop rcx
    pop rbx
    pop rax
    ret

segment .text
global _start 
segment .data
hell: db  'hell!', 0xA ,0

_start:
    
    mov rax,hell
    call _print

    mov rax,1
    mov rbx,0 
    int 0x80

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

Автор решения: motpfofs

Попробуйте добавить main: перед _start::

segment .data
hell: db  'hell!', 0xA ,0

segment .text
global main 
global _start 

main: ; standard gcc entry point
_start:
→ Ссылка
Автор решения: Alexander Prokoshev

Использование int 80h для системных вызовов ядра Linux давно (думаю, в районе десяти лет как) deprecated и для x86, и для amd64 архитектур. Вместо него для x86 используется sysenter, а для amd64 — syscall.

Номера системных вызовов находятся в arch/x86/entry/syscalls/syscall_64.tbl

Семантика вызова для amd64: все параметры в регистрах; номер вызова (из предыдущего абзаца) в RAX, параметры в RDI, RSI, RDX, R10, R8[, R9]. Возврат: в RAX возвращаемое значение, RCX и R11 портятся, остальные регистры сохраняются.

→ Ссылка