global _start

section .data
arr db 5, 7, 3, 1, 2
arrEnd:

buff times 32 db 0
buffend:
count dq 0

section .text
default rel

_start:
    mov al, 0xFF
    lea rsi, [arr]
    lea rdi, [arrEnd]

.while:
    movzx rbx, byte [rsi]   ; текущее число
    cmp rbx, rax
    cmovl rax, rbx
    inc rsi
    cmp rsi, rdi
    jne .while

    call print_num_to_buf
    
    mov rdx, [count]
    call write_text

    mov rax, 60
    mov rdi, 0
    syscall


; Функция выводит buff
; In:
;   - RSI - начало буфера
;   - RDX - размер буфера
; Регистры не изменяет
write_text:
    push rax
    push rdi
    push rsi
    push rdx

    mov rax, 1          ; sys_write
    mov rdi, 1          ; stdout
    syscall
    mov [count], rax

    pop rdx
    pop rsi
    pop rdi
    pop rax
    ret


; Функция выводит число в buff
; In: RAX 
; Out: RSI - указатель на начало строки
print_num_to_buf:
    lea rsi, [buffend]
    dec rsi

    mov rdi, rsi            ; сохранить последний адрес
    mov byte [rsi], 0       ; вписать нуль
    dec rsi
    mov byte [rsi], 0xA     ; вписать перенос строки
    dec rsi
    mov byte [rsi], '0'

    test rax, rax
    jz .return

    mov rcx, 10         ; десятичный делитель

    .while:
        xor rdx, rdx
        test rax, rax
        jz .break
        div rcx
        or dl, 0x30
        mov [rsi], dl
        dec rsi
        jmp .while
.break:
    inc rsi
.return:
    sub rdi, rsi
    inc rdi
    mov [count], rdi
    ret
