Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы_сиппо.doc
Скачиваний:
19
Добавлен:
22.04.2019
Размер:
230.91 Кб
Скачать

13. Команды обработки строк.

Команды обработки строк позволяют работать с последовательностью символов (байт) как с единым целым. В языке Си строка – последовательность символов, оканчивающаяся символом с кодом ноль «\0». Нулевой символ не входит в строку. Для Ассемблера содержимое строки не имеет значения, главное – длина символа. Длина символа равна байту, слову или двойному слову.

Для обработки последовательности символов (байт, слов, двойных слов) используются команды-префиксы:

  • REP – повторять, пока ECX ¹ 0

  • REPE/REPZ – повторять, пока ECX ¹ 0 или пока ZF = 1

  • REPNE/REPNZ – повторять, пока ECX ¹ 0 или пока ZF = 0

Адрес строки-источника находится в регистре ESI. Адрес строки-приемника находится в регистре EDI. В процессе выполнения строковых команд регистры ESI и EDI автоматически изменяются на длину символа строки в зависимости от флага направления (DF – Direction Flag).

Если DF = 0, то значения ESI и EDI увеличиваются (строка обрабатывается слева направо – в сторону больших адресов). Если DF = 1, то значения ESI и EDI уменьшаются (строка обрабатывается справа налево – в сторону меньших адресов). Флаг DF устанавливается и сбрасывается командами STD и CLD

Команды пересылки:

  • MOVSB – копирование строки байтов

  • MOVSW – копирование строки слов

  • MOVSD – копирование строки двойных слов

Команды сравнения:

  • CMPSB – сравнение строк байтов

  • CMPSW – сравнение строк слов

  • CMPSD – сравнение строк двойных слов

Команды поиска (сканирования):

  • SCASB – сканирование строки байт (сравнение элементов строки с AL)

  • SCASW – сканирование строки слов (регистр AX)

  • SCASD – сканирование строки двойных слов (регистр EAX)

  • Изменяется регистр EDI

Команды чтения из строки:

  • LODSB – чтение байта из строки в AL

  • LODSW – чтение слова из строки в AX

  • LODSD – чтение двойного слова из строки в регистр EAX

  • Изменяется регистр ESI

Команды записи в строку:

  • STOSB – запись байта из регистра AL в элемент строки

  • STOSW – запись слова из регистра AX в элемент строки

  • STOSD – запись двойного слова из регистра EAX в элемент строки

  • Изменяется регистр EDI

14. Консольные приложения: api-функции для работы с консольными приложениями.

Windows поддерживает два типа приложений:

  • основанные на графическом интерфейсе (Graphical User Interface, GUI);

  • консольные (Console User Interface, CUI)

Консоль – текстовое окно. Консоль – интерфейс для ввода-вывода в текстовом режиме. Система создает консоль, когда запускается консольное приложение. Консоль состоит из входного буфера (input buffer) и одного или нескольких экранных буферов (screen buffers). Входной буфер содержит очередь входных событий (нажатие клавиш, события мыши, изменение размеров экранного буфера). Выходной буфер – это двумерный массив символов и цветовых данных для вывода на экран. Консольный процесс использует дескрипторы (описатели, handles) для доступа к входному и экранному буферам своей консоли. Дескриптор представляет собой индекс в таблице дескрипторов, принадлежащих процессу. Таблица дескрипторов содержит указатели на все объекты, используемые данным процессом.

Чтобы получить дескриптор консоли, нужно использовать следующую функцию:

HANDLE GetStdHandle (DWORD nStdHandle)

Функция возвращает дескриптор одного из стандартных устройств:

  • стандартного ввода (standard input)

  • стандартного вывода (standard output)

  • стандартного сообщения об ошибке (standard error)

Аргументом функции GetStdHandle является одна из следующих констант:

  • для ввода:

STD_INPUT_HANDLE equ -10

  • для вывода:

STD_OUTPUT_HANDLE equ -11

  • для сообщения об ошибке:

STD_ERROR_HANDLE equ -12

Для вывода на консоль используется функция WriteConsole:

BOOL WriteConsole(

HANDLE hConsoleOutput, ; дескриптор выходного буфера консоли

const VOID* lpBuffer, ; адрес строки для вывода на консоль

DWORD nNumberOfCharsToWrite, ; длина строки

LPDWORD lpNumberOfCharsWritten, ; адрес переменной, куда будет помещено количество действительно выведенных символов

LPVOID lpReserved ) ; зарезервировано, нужно 0

Для завершения приложения используется функция ExitProcess:

VOID ExitProcess(UINT uExitCode)

Для создания консоли из процесса можно воспользоваться двумя способами:

1) функция AllocConsole (без аргументов)

2) функция CreateProcess с параметром CREATE_NEW_CONSOLE

При завершении программы консоль автоматически освобождается.

Установку позиции курсора осуществляет функция SetConsoleCursorPosition:

BOOL SetConsoleCursorPosition(

HANDLE hConsoleOutput,

COORD dwCursorPosition);

Заголовок окна консоли определяет функция SetConsoleTitle:

BOOL SetConsoleTitle(

LPCTSTR lpConsoleTitle);

где lpConsoleTitle – адрес строки, оканчивающейся на ноль (в OEM-кодировке).

Всего консольных функций около 60

При правильном их завершении возвращается ненулевое значение

В случае ошибки в EAX помещается ноль

Отладку консольных приложений можно осуществлять в дизассемблерах (W32Dasm, OllyDbg)