ntsys/examples/hello_user.asm
2026-03-20 15:01:44 +04:00

98 lines
5.2 KiB
NASM
Raw 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.

global db main ; Точка входа
readmem: ; Функция чтения из памяти
push dw 0x00 ; Адрес
mread dw ; Читаем
ret ; Конец функции
insub: ; Уменьшение адреса
push dw 1 ; На сколько уменьшать
push byte 2 ; Поменять два места
swap dw ; Тип данных - size_t
sub dw ; Уменьшить
ret ; Конец функции
writemem: ; Функция записи в память
push dw 0x00 ; Адрес
mwrt dw ; Записываем
ret ; Конец функции
decrement: ; Управление данными
rcall db readmem ; Прочитать
rcall db insub ; Уменьшить
rcall db writemem ; Записать
ret ; Конец функции
main: ; Точка входа
push.string "Введите ваше имя: " ; Строка
push byte 0x00 ; Дескриптор
syscall ; Выводим
begin: ; Настройка адресов
push dw 0x02 ; Указатель
push dw 0x00 ; Адрес
mwrt dw ; Записываем
inloop: ; Цикл чтения символов
push byte 0x01 ; Дескриптор
syscall ; Читаем
copy byte ; Копируем char
push dw 0x00 ; Адрес
mread dw ; Читаем
mwrt byte ; Записываем
push dw 0x00 ; Читаем
mread dw ; Указатель
push dw 0x01 ; Увеличить
add dw ; На 1
push dw 0x00 ; Адрес
mwrt word ; Сохраняем указатель
push byte 0x0A ; Символ переноса
push db inloop ; Цикл
push byte 2 ; Кол-во слов
swap word ; Меняем их местами
neq byte ; Если не \n - повторить цикл
userhello: ; Приветствие
push.string "Привет, " ; Текст
push byte 0x00 ; Дескриптор
syscall ; Выводим
rcall db decrement ; Уменьшаем
push byte 0x00 ; Символ конца строки
readcycle: ; Цикл чтения
push db writeusername ; Конец цикла
push dw 0x00 ; Адрес
mread dw ; Указатель
push dw 0x01 ; Число
eq dw ; Если равно - выйти
push db rdecrem ; Адрес
push dw 0x00 ; Иначе
mread dw ; Читаем указатель
mread byte ; Читаем байт по указателю
push byte 0x0A ; Если символ переноса
eq byte ; Пропускаем добавление на стек
push dw 0x00 ; Иначе
mread dw ; Читаем указатель
mread byte ; Читаем байт по указателю
rdecrem: ; Уменьшение указателя
rcall db decrement ; Уменьшаем
push db readcycle ; Указатель на цикл
jmp ; Повторить цикл
writeusername: ; Выводим имя
push byte 0x00 ; Дескриптор
syscall ; Выводим
push.string "!\n" ; Выводим !
push byte 0x00 ; Дескриптор
syscall ; Выводим