Для сборки используйте команду
ml64 code.asm /link /entry:start /subsystem:console kernel32.lib
- Вывод в консоль приглашения для ввода строки
- Чтение строки с консоли
- Генерация палиндрома на основе строки из п.2
- Вывод строки в консоль
- RSI - адрес строки
- RCX - длина строки
- RAX - дескриптор файла
- Результат - через RAX возвращаем количество записанных байтов
write собственно выполняет запись в файл. Через регистр RAX она получает дескриптор файла. Причем это может быть дескриптор консольного вывода, а может быть и дескриптор какого-то другого файла. Таким образом, мы абстрагируемся от консоли и определяем универсальную функцию записи. Через регистр RSI она получает адрес строки, а через RCX - размер строки. Внутри функции устанавливаются все необходимые регистры и вызывается внешняя функция WriteFile. Результат функции - или количество записанных байтов, которое хранится в стеке по адресу rsp+40, либо -1, если произошла ошибка. В данном случае мы никак не обыгрываем данную ситуацию, но в принципе мы можем проверить результат данной процедуры для последующих действий, например, для вывода пользователю сообщения об ошибке и т.д.
- Процедура вывода произвольной строки на консоль
- Параметры
- RSI - адрес строки
- RCX - количество символов
- Результат - в RAX количество записанных байтов или -1, если произошла ошибка
Непосредственно для вывода данных на консоль определена функция writeToConsole. В ней получаем дескриптор консольного вывода с помощью вызова функции GetStdHandle и сохраняем в переменную stdout. Чтобы указать, что дескриптор стандартного вывода установлен, присваиваем переменной stdoutSet. Сравнивая ее значение, мы можем определить, был ли ранее получен дескриптор. Это позволит при повторном вызове процедуры writeToConsole избежать ненужных обращений к функции GetStdHandle. После получения дескриптора передаем его процедуре write и с ее помощью собственно выполняем запись.
- RAX - дескриптор файла,
- RDI - буфер для считывания
- RCX - длина буфера
- Результат - в RAX количество записанных байтов или -1, если произошла ошибка
read получает через регистр RAX дескриптор файла (в данном случае дескриптор стандартного ввода), через регистр RDI буфер для считывания данных и через RCX - максимальное количество считываемых символов. И также возвращает либо количество считанных символов, либо число -1 - условный код ошибки.
- RDI - буфер для считывания
- RCX - длина буфера
- Результат - в RAX количество записанных байтов или -1, если произошла ошибка
Процедура readFromConsole получает дескриптор консольного ввода и вызывает процедуру read для считывания с консоли.
Какое то описание...
- Написать функцию для считывания данных из консоли +
- toUpper заменить на genPalindrome
- Написать функцию для генерации палиндрома на основе методички НГТУ.