; Макрос для вывода сообщения ; 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