- •Цикл команды процессора.
- •2. Методы повышения производительности. Кэш-память. Конвейеризация. Суперскалярные процессоры.
- •Микроархитектура Intel Pentium 4.
- •4. Регистры и режимы адресации процессора Intel Pentium 4.
- •5. Язык Ассемблер. Области применения Ассемблера. Программы на ассемблере. Общая схема трансляции программы.
- •6. Команды пересылки данных. Косвенная адресация памяти. Команды работы со стеком.
- •7. Команды сложения и вычитания. Команды умножения и деления. Команды распространения знака.
- •8. Команды работы с битами. Логические команды. Операции сдвига.
- •9. Команды передачи управления. Команда безусловного перехода. Команды условного перехода.
- •10. Команды вызова процедур. Команды организации циклов.
- •11. Работа с массивами. Одномерные массивы, двумерные статические массивы.
- •12. Работа с массивами. Двумерные динамические массивы.
- •13. Команды обработки строк.
- •14. Консольные приложения: api-функции для работы с консольными приложениями.
- •15. Обработка событий в консольных приложениях.
- •17. Структура gui-приложения. Регистрация класса окон.
- •21. Оптимизация: цель, критерии, требования, методика, средства.
- •22. Алгоритмическая оптимизация: временная сложность, сравнение алгоритмов, примеры.
- •23. Способы измерения времени. Применение рекурсии. Примеры.
- •24. Программная оптимизация: связь с архитектурой процессора, приемы оптимизации, векторизация, оптимизация циклов.
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)