Files
NASM/stepik_base/less_greater_10/less_greater_10.asm
2025-09-23 18:00:44 +03:00

109 lines
2.4 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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