; Макрос для вывода сообщения
; In:
;   - %1 - указатель на буффер с сообщением
;   - %2 - длина сообщения
%macro PRINT_MSG 2
    mov rsi, %1
    mov rdx, %2
    mov rdi, 1          ; stdout
    
    mov rax, 1          ; sys_write
    syscall
%endmacro

global _start

section .data
g_buff times 32 db 0
g_buff_end:
g_len dq 0

g_less_or_equal db "Less than or equal to 10"
g_less_or_equal_len dq $-g_less_or_equal
g_greater db "Greater than 10"
g_greater_len dq $-g_greater

section .text
default rel

_start:
    call read_text
    
    lea rsi, [rel g_buff]     ; поставить указатель на начало буфера
    call read_num

    cmp rax, 10
    jle .le
.g:
    lea rdi, [g_greater]
    mov rdx, [g_greater_len]
    jmp .print
.le:
    lea rdi, [g_less_or_equal]
    mov rdx, [g_less_or_equal_len]

.print:    
    PRINT_MSG rdi, rdx

    mov rax, 60
    mov rdi, 0
    syscall

; Функция читает текст в буффер
; Регистры не изменяет
read_text:
    push rax
    push rdi
    push rsi
    push rdx

    mov rax, 0          ; sys_read
    mov rdi, 0          ; stdin
    lea rsi, [rel g_buff]       ; адрес буфера
    mov rdx, 256        ; количество байт
    syscall
    mov [g_len], rax

    pop rdx
    pop rsi
    pop rdi
    pop rax
    ret


; Функция читает число из stdin
; Out: RAX
read_num:
    push rbx
    push rcx
    xor rbx, rbx        ; обнулить регистр для символов
    xor rax, rax        ; обнулить аккумулирующий регистр
    mov rcx, 10         ; множитель для сдвига

    lea rdi, [g_buff]     ; rdi - конец данных
    add rdi, [g_len]

    .while:
        cmp rsi, rdi        ; сначала проверяем границы, чтобы не читать за пределами
        jge .return

        mov bl, [rsi]       ; прочитать текущий символ

        cmp bl, 0xA         ; если конец строки (\n) - закончить
        je .return
        cmp bl, 0           ; если null (\0) - закончить
        jz .return
        cmp bl, ' '         ; если пробел - закончить
        jz .return

        mul rcx
        and bl, 0x0F
        add rax, rbx
        inc rsi
        jmp .while

.return:
    pop rcx
    pop rbx
    ret
