- •Системное программирование на макроассемблере masm32
- •«Системное программирование» (часть 1)
- •Вступление
- •1Организация среды исполнения для масм
- •1.1Цель работы
- •1.2 Теоретические сведения
- •If errorlevel 0 команда2
- •If errorlevel 0 goto метка
- •1.3Выполнение работы
- •1.4Состав отчета по работе
- •1.5Контрольные вопросы
- •2.2.2Состав пакета масм
- •2.2.3Центр масм – редактор Quick Editor
- •2.3Выполнение работы
- •2.4Состав отчета по работе
- •2.5Контрольные вопросы
- •3Высокоуровневый интерфейс языка масм
- •3.1Цель работы
- •3.2 Теоретические сведения
- •3.2.1Процедуры и макросы в ассемблере
- •3.2.2Синтаксис высокого уровня масм
- •3.2.3Макрос invoke
- •3.3Выполнение работы
- •4.2.2Потоки вывода и ввода
- •4.2.3Вывод и ввод в консольных приложениях
- •4.3Выполнение работы
- •4.4Состав отчета по работе
- •4.5Контрольные вопросы
- •5Ввод и вывод в ассемблерных приложениях с графическим интерфейсом
- •5.1Цель работы
- •5.2Теоретические сведения
- •5.3Выполнение работы
- •6.3.1Фрейм кода (области 1-5)
- •6.3.2Фрейм дампа памяти (области 9,10 и 11)
- •6.3.3Фрейм регистров процессора (области 6, 7 и 8)
- •6.3.4Фрейм стека (области 12, 13 и 14)
- •6.4Выполнение работы
- •6.5Состав отчета по работе
- •6.6Контрольные вопросы
- •Приложение а Префиксы «венгерской» нотации типов данных WinApi
- •Рекомендованная литература
4.2.2Потоки вывода и ввода
В ОС Windows, как и во многих других, в отношении ввода-вывода применяется абстракция «файл». В информатике в самой общей трактовке используют следующее определение: файл — это поименованная последовательность байтов.
Имеют подобные файлам имена и обрабатываются логически похожим образом:
области данных (необязательно на диске);
устройства (порты - как физические, так и виртуальные);
потоки данных («именованный канал»);
сетевые ресурсы, сокеты;
объекты операционной системы.
В ОС Windows c открытым файлом (и не только с файлами) связывается дескриптор (описатель, хэндлер), который по смыслу есть индекс в некоей таблице указателей на объекты, с которыми работает ОС. При закрытии файла хэндлер теряет смысл.
Если на абстрактный объект «последовательный файл» накладывается еще дополнительное ограничение - запрет на обратное перемещение относительно текущей позиции в файле, то получается еще одна часто используемая информационная абстракция – «поток». Получается, что из входного потока можно только читать всё новые и новые порции данных, но повторно перечитать ранее прочитанное нельзя. Аналогично, в выводной поток можно передавать все новые и новые данные, но «перемотать поток назад» и переписать часть его содержимого по-другому нельзя. Как мы видим, всё это очень похоже на события, которые в реальном мире связаны со временем их совершения (во времени обратно двигаться нельзя по физике нашего мира, а в потоке – по договоренности, но аналогия есть). Абстракция «поток» и придумана для моделирования «событий во времени».
В Unix-системах со всякой программой по умолчанию связываются три стандартных логических потока – вводной stdin (номер 0), выводной stdout (номер 1) и поток вывода сообщений об ошибках stderr (номер 2). В ОС Windows этого обязательного условия нет, но в этом курсе эти имена нам встретятся в качестве имен процедур вывода и ввода и полезно понимать состояние вопроса.
4.2.3Вывод и ввод в консольных приложениях
Консольный режим работы приложения характеризуется несколькими особенностями. Во-первых, вывод и ввод имеют исключительно символьный характер (это означает, что нельзя, к примеру, ввести в программу число 94, это будет воспринято как строка «94»). Во-вторых, вывод производится в текущую позицию экрана текстового экрана консоли, с которым в памяти связан экранный буфер консоли. В-третьих, ввод связывается с клавиатурой или, в случае перенаправления, с текстовым файлом.
При консольном выводе прямо или косвенно используется функция WinAPI WriteFile,
BOOL WriteFile(
HANDLE hFile, // дескриптор файла
LPCVOID lpBuffer, // буфер данных
DWORD nNumberOfBytesToWrite, // число байтов для записи
LPDWORD lpNumberOfBytesWritten, // число записанных байтов
LPOVERLAPPED lpOverlapped // асинхронный буфер
);
описание которой находится по адресу http://msdn.microsoft.com/en-us/library/ms892380.aspx.
При консольном вводе прямо или косвенно используется функция WinAPI ReadFile
BOOL WINAPI ReadFile(
__in HANDLE hFile,
__out LPVOID lpBuffer,
__in DWORD nNumberOfBytesToRead,
__out_opt LPDWORD lpNumberOfBytesRead,
__inout_opt LPOVERLAPPED lpOverlapped
);
описание которой находится по адресу http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx/