Больше или меньше 10

This commit is contained in:
Пытков Роман
2025-09-23 18:00:44 +03:00
parent 184eeb8525
commit 1f40ef4467
4 changed files with 193 additions and 0 deletions

View File

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