; --- SECTION .DATA: Определяем данные (строки для вывода) ---
section .data
prompt_msg db "Сейчас утро? (Y/N): ", 0x0A ; Запрос с новой строки
prompt_len equ $ - prompt_msg ; Длина строки запроса
morning_msg db "Доброе утро!", 0x0A ; Сообщение для 'N'
morning_len equ $ - morning_msg ; Длина сообщения
day_msg db "Добрый день!", 0x0A ; Сообщение для других символов
day_len equ $ - day_msg ; Длина сообщения
input_buffer db 0 ; Буфер для хранения символа с клавиатуры (1 байт)
; --- SECTION .TEXT: Определяем исполняемый код ---
section .text
global _start ; Точка входа для линкера
_start:
; --- Вывести запрос "Сейчас утро? (Y/N): " ---
; Syscall: write (номер 1)
; rdi: File Descriptor (1 = stdout)
; rsi: Адрес строки
; rdx: Длина строки
mov rax, 1 ; Syscall #1 (write)
mov rdi, 1 ; File descriptor for stdout
mov rsi, prompt_msg ; Address of prompt_msg
mov rdx, prompt_len ; Length of prompt_msg
syscall ; Execute syscall
; Принять один символ с клавиатуры
; Syscall: read (номер 0)
; rdi: File Descriptor (0 = stdin)
; rsi: Адрес буфера для сохранения ввода
; rdx: Максимальное количество байт для чтения (1 символ)
mov rax, 0 ; Syscall #0 (read)
mov rdi, 0 ; File descriptor for stdin
mov rsi, input_buffer ; Address of input_buffer
mov rdx, 1 ; Read only 1 byte
syscall ; Execute syscall
; Сравнить введенный символ с 'N'
; Первый символ из буфера input_buffer
cmp byte [input_buffer], 'N' ; Сравниваем первый байт буфера с ASCII-кодом 'N'
je .print_morning ; Если равно 'N', перейти к выводу "Доброе утро!"
; Дополнительно: Проверить на 'n' (строчные буквы)
cmp byte [input_buffer], 'n' ; Сравниваем первый байт буфера с ASCII-кодом 'n'
je .print_morning ; Если равно 'n', перейти к выводу "Доброе утро!"
; Если не 'N' и не 'n', то вывести "Добрый день!"
mov rax, 1 ; Syscall #1 (write)
mov rdi, 1 ; File descriptor for stdout
mov rsi, day_msg ; Address of day_msg
mov rdx, day_len ; Length of day_msg
syscall ; Execute syscall
jmp .exit_program ; Перейти к завершению программы
.print_morning:
; Вывести "Доброе утро!"
mov rax, 1 ; Syscall #1 (write)
mov rdi, 1 ; File descriptor for stdout
mov rsi, morning_msg ; Address of morning_msg
mov rdx, morning_len ; Length of morning_msg
syscall ; Execute syscall
.exit_program:
; --- Завершить программу ---
; Syscall: exit (номер 60)
; rdi: Код выхода (0 = успех)
mov rax, 60 ; Syscall #60 (exit)
mov rdi, 0 ; Exit code 0
syscall ; Execute syscall