ASM intel macho64 невъзможен за печат 10 (\n)

Трябва да направя функция puts в сборка intel macho64 Бих искал да разбера какво и защо не отпечатах \n ! в моя main.c извиквам puts два пъти, но получих текста си без \n

Компилирам с:

nasm -f macho64 ft_puts.s

Създавам функция putstr за отпечатване на низ:

%define SYSCALL(nb) 0x2000000 | nb
%define STDOUT  1
%define WRITE   4

section .text
    global  _ft_putstr
    extern  _strlen

_ft_putstr:
    push    rbp
    mov     rbp ,   rsp
    mov     rbx ,   rdi

    cmp     rbx ,   0x0
    je      exit
    mov     rdi ,   rbx

    call    _strlen
    mov     rdx ,   rax
    mov     rdi ,   STDOUT
    mov     rsi ,   rbx
    mov     rax ,   SYSCALL(WRITE)
    syscall

exit:
    leave
    ret

Тогава моята функция puts:

%define SYSCALL(nb) 0x2000000 | nb
%define STDOUT  1
%define WRITE   4

section .rodata
    retline  db 10
  nullstr  db "(null)"

section .text
    global  _ft_puts
  extern  _ft_putstr

_ft_puts:
    push    rbp
    mov     rbp ,   rsp
    mov     rbx ,   rdi

    cmp     rbx ,   0x0
    je      null

print:
    mov     rdi ,   rbx
    call    _ft_putstr

print_retline:
  lea   rdi , [rel retline]
    call  _ft_putstr

exit:
    mov rax ,   '10'
    leave
    ret

null:
  lea   rdi , [rel nullstr]
  call  _ft_putstr
  jmp   print_retline

person albttx    schedule 13.10.2015    source източник
comment
Вашите низове не трябва ли да бъдат NUL-терминирани? Как иначе strlen трябва да намери техните дължини?   -  person Michael    schedule 14.10.2015
comment
не, @Michael, не променя нищо, за да добави нула след моя низ .. и да, strlen е c функция за получаване на дължината на низ (вж.: man strlen) PS: ако нямате представа, моля, гласувайте за   -  person albttx    schedule 14.10.2015
comment
Може да срещате известната грешка в nasm.   -  person Jester    schedule 14.10.2015
comment
@Jester Този код работи github.com/elieteyssedou/ASM/blob/master/ft_puts .s ! но искам да разбера защо моята не го прави   -  person albttx    schedule 14.10.2015