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