- •Системное программирование на макроассемблере masm32
- •Содержание
- •Вступление
- •Префиксы «венгерской» нотации типов данных в описаниях вызовов функций аpi Win32 (Win64)
- •Работа с консолью
- •Цель работы
- •Теоретические сведения
- •Консоль
- •Начальные настройки
- •Как в cmd.Exe выделять-копировать-вставлять текст
- •История ввода команд
- •Заменяющие символы в шаблонах имён
- •Выполнение работы
- •Навигация по дискам и папкам
- •Поиск файлов и папок по имени или шаблону
- •Копирование, перенос, переименование и удаление файлов
- •Создание и уничтожение папок
- •Создание текстового файла
- •Просмотр содержимого файлов
- •Поиск файлов, содержащих нужную строку
- •Состав отчета по работе
- •Состав пакета масм
- •Последовательность создания исполняемого ехе-модуля на масм
- •Режимы компоновки
- •Выполнение работы
- •Создание консольной программы
- •Создание программы с графическим интерфейсом
- •Использование шаблона простой программы
- •Состав отчета по работе
- •Параметризация макросов
- •Уникальность меток при макрорасширениях
- •Макроконстанты
- •Макропеременные и макровычисления
- •Увидеть работу макрогенератора
- •Расширенный листинг
- •Выполнение работы
- •Макроопределение и макрорасширение
- •Повторение строк repeat
- •Цикл for
- •Анализ расширенного листинга программы
- •Состав отчета по работе
- •Потоки вывода и ввода
- •Вывод и ввод в консольных приложениях
- •Invoke GetStdHandle,std_output_handle ; манипулятор возвращен в еах, ...
- •InputBuffer db 25 dup (0) ; вводной буфер фрагмент 3
- •Высокоуровневый консольный ввод-вывод с использованием макросов
- •Макрос консольного вывода print
- •Макросыконсольного вводаinput и inkey
- •Преобразование строки в число
- •Inkey "Жду кнопочку."
- •Преобразование числа в строку
- •Выполнение работы
- •Invoke ExitProcess,0 ; выход в Windows
- •Эксперимент 1. Ввод-вывод функциями Win32
- •Эксперимент 2
- •Эксперимент 3
- •Эксперимент 4
- •Состав отчета по работе
- •Последовательное выполнение команд
- •Передача управления в другое место кода
- •Возврат управления в основную программу
- •Метка_к5:
- •Jmp Метка_к5
- •Call метка_процедуры
- •Передача параметров в процедуру
- •Внутренние переменные в процедурах
- •Как компилятор ml.ExEпомогает организовать работу с процедурами
- •Автоматическое создание пролога и эпилога
- •Автоматическое размещение внутренних переменных
- •Повышение надежности и облегчение вызовов – макрос invoke
- •Выполнение работы
- •Invoke ExitProcess,0 ; выход в Windows
- •Неразрешённые внешние ссылки
- •Выполнение работы
- •Программные инструменты для работы
- •Изготовление файлов для сравнений
- •Восстановление структуры двоичного представления объектного файла
- •Анализ неразрешенных внешних ссылок в объектном файле
- •Состав отчета по работе
- •Исполнение программы под отладчиком
- •Оперативная память «физическая» и виртуальная
- •Выполнение работы
- •Подготовка текстовых файлов для работы
- •Исследование структуры ехе-файла
- •Исследование выполнения программы под отладчиком
- •Карта размещения программы в виртуальной оперативной памяти
- •Действительные ссылки, бывшие раньше неразрешенными
- •Состав отчета по работе
- •Вопросы для самопроверки
- •Рекомендованная литература
Оперативная память «физическая» и виртуальная
Оперативная память физически находится в байтах микросхем, которые смонтированы на модулях-платах, вставленных в соответствующие разъемы материнской платы (рис.5.3).
Рисунок 5.3 – Монтаж модуля памяти на материнскую плату.
В многозадачном режиме работы операционной системе приходится размещать в этой памяти активные кусочки всех запущенных процессов. Неактивные (не выполняемые в данный момент) кусочки программ временно записываются в специальный буферный «пейдж-файл» на винчестере, откуда они при необходимости подгружаются в физическую память.
Единицей дробления физической памяти есть «страница» размером 4 кБ. Именно такими порциями ОС отдает процессу физическую память, и именно такими страницами происходит обмен (своппинг) с пейдж-файлом.
Но каждый процесс (запущенная на компьютере программа) об этих нюансах «не знает», подобно тому, как маленький ребенок не знает, откуда в доме берутся продукты и вещи. Как-то. Волшебным образом.
Он (процесс) «наивно полагает» (просим прощения за олицетворение неодушевленного), что он выполняется в адресном пространстве размером 32 ГБ (с адресами от 00000000 до FFFFFFFF). Такая «воображаемая процессом» память названа виртуальной.
Как же это может совмещаться? Предположим, на не самом слабом компьютере установлено 8 ГБ физической памяти. И на нем исполняется, предположим, 27 процессов, и каждый «наивно полагает», что у него в распоряжении по 32 ГБ памяти. Как «поместить» 27 раз по 32 ГБ в имеющиеся на материнке 8 ГБ?
Ответ такой – используется принцип «частичного отображения» страниц виртуальной памяти процесса на отданные (в данный момент) процессу физические страницы.
То есть программа представляется в физической памяти не всеми 32 гигабайтами, только несколькими страничками по 4 кБ, с которыми в данный момент фактически работаетпроцессор. Менеджер памяти операционной системы для каждой физической страницы хранит значения диапазона адресов виртуальной памяти, которые отображаются а эту страницу.
Например, есть физическая 4-килобайтная страница номер 3 (нумерация от 0), ее начальный физический адрес 3*4 кБ = 3 * 4 * 1024 б = 12 * 1024 = 12288 = 3000h. Суффикс «h» означает, что число 16-ричное. (Кому непонятно, откройте Калькулятор, придайте ему Вид –Программист и проверьте вычисления; это не зазорно, мы поступали точно так же). И пусть на неё отображается участок виртуальной памяти процесса с начальным адресом 403000h. (Поскольку страница имеет объем 4 кБ = 1000hбайт , то нетрудно сосчитать, что последний байт этой страницы имеет виртуальный адрес 403000h+ 1000h-1 = 403FFFh. Соответственно, самый старший байт нашей физической страницы имеет физический адрес 3000h+ 0FFFh=3FFFh). Таким образом, когда наш «наивный» процесс что-то читает/пишет в диапазоне виртуальных адресов от 403000hдо 403FFFh, менеджер памяти подсовывает ему физические адреса от 3000hдо 3FFFh. Называется – «отображение»…
Совсем конкретный пример. Процессу нужно прочитать байт с адресом 403011h. Менеджер памяти находит физическую страницу, внутри которой находится интересующий адрес (это как раз рассмотренная выше страница). У этой страницы начальный виртуальный адрес – 403000h. Значит, нужный байт имеет смещение от начала страницы 403011h- 403000h=11hбайт. Отсчитываем это смещение от физического начала страницы 3000hи получаем физический адрес 3000h+11h=3011h. Вот оно «отображение» и есть – процесс «думает», что он читает с адреса 403011h, а фактически (и физически) читается «кремниевый», сидящий в микросхеме байт с физическим адресом 3011h.
Именно так обеспечивается одновременное присутствие в физической памяти практически любого нужного количества параллельно выполняющихся процессов. Просто все они присутствуют в физической памяти не полностью каждый, а только теми фрагментами, которые нужны для выполнения «здесь и сейчас».