98 lines
5.2 KiB
NASM
98 lines
5.2 KiB
NASM
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 ; Выводим |