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 ; Выводим