ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Виртуальная память Windows XPВ Windows XP каждый пользовательский процесс имеет собственное виртуальное адресное пространство. Длина виртуального адреса составляет 32 бита, поэтому у каждого процесса есть 4 Гбайт виртуального адресного пространства. Нижние 2 Гбайт предназначены для кода и данных процесса; верхние 2 Гбайт обеспечивают доступ (ограниченный) к памяти ядра. Виртуальное адресное пространство с подкачкой страниц по требованию содержит страницы фиксированного размера D Кбайт на машине Pentium 4). Каждая виртуальная страница может находиться в одном из трех состояний: свободна (free), зарезервирована (reserved) или выделена (committed). Свободная страница в текущий момент не используется, и обращение к ней вызывает ошибку отсутствия страницы. Когда процесс начинается, все его страницы находятся в свободном состоянии до тех пор, пока программа и начальные данные не будут отображены на свое адресное пространство. Если код или данные отображены в страницу, то такая страница является выделенной. Обращение к выделенной странице будет успешным, если страница находится в основной памяти. Если страница отсутствует в основной памяти, произойдет ошибка, и операционной системе придется вызывать нужную страницу с диска. Виртуальная страница может находиться и в зарезервированном состоянии. Это значит, что страница остается недоступной для отображения до тех пор, пока резервирование не будет отменено. Помимо атрибутов состояния, страницы имеют и другие атрибуты (например, указывающие на возможность чтения, записи и выполнения). Windows XP позволяет отображать файлы прямо на области виртуального адресного пространства. Если файл отображен на адресное пространство, его можно считывать или записывать путем обычных обращений к памяти. Windows XP позволяет двум и более процессам одновременно отобразить один и тот же файл, возможно, на разные виртуальные адреса.
6. Интерфейс ассемблера с языками высокого уровня, ассемблерные вставки, особенности использования отдельных ассемблерных модулей в современных средах программирования для языков C++, Object Pascal. Применение:-для повышения производительности критических мест программы -для прямого доступа к оборудованию Ассемблерные вставки. Первый и самый простой вариант заключается в использовании ассемблерных вставок. MS Visual C++ (и другие) поддерживает директиву __asm, позволяющую включать ассемблерный код непосредственно в текст программы на C++. Данный подход весьма удобен. Во-первых, программист из ассемблерной вставки может обращаться по именам к переменным C++, в том числе к локальным и параметрам функций. Во-вторых, не нужно учитывать особенности компоновки объектных модулей, именования функций и соглашения о передаче параметров. Разворот битов в заданном однобайтовом числе: int turn (unsigned char b){ unsigned char res; __asm{ mov al,b;помещаем исходный байт в al mov bl,0;а здесь будет результат mov ecx,8;цикл будет на 8 итераций L1: shr al, 1;выдвигаем младший бит в CF rcl bl, 1;задвигаем бит из CF в bl loop L1 mov res, bl;результат в возвращаемую перем-ю } return res; } Подключение ассемблерного модуля. Второй вариант интеграции ассемблера с C++ заключается в разработке отдельного ассемблерного модуля и компиляции его в объектный файл, код из которого присоединяется к исполняемому файлу на этапе компоновки. Здесь нужно учитывать некоторые моменты. 1. Отключение декорирования имён. Для этого объявляем прототип функции в C++ с помощью директивы extern “C”. 2. В C++ при создании объектного файла в начало всех идентификаторов добавляет знак подчеркивания. Также необходимо учитывать порядок расположения параметров в стеке при вызове функций и порядок их освобождения. Чтобы всё это выполнялось автоматически, достаточно в директиве.model указать спецификатор языка C. Файл myfunc.asm: .486 .model flat, c .code ;функция разворачивает биты в байте ;входной байт - в стеке, результат будет в al turn PROC b:BYTE mov bl,b;помещаем исходный байт в bl mov eax,0;а здесь будет результат mov ecx,8;цикл будет на 8 итераций L1: shr bl, 1;выдвигаем младший бит в CF rcl al, 1;задвигаем бит из CF в bl loop L1 ret turn ENDP end Файл bturn.cpp: #include <iostream> using namespace std; extern "C" unsigned char turn (unsigned char c); int main(){ unsigned int i; cin >> i; i = turn(i); cout << i <<endl; return 0; } Далее идёт подключение *.obj к проекту и сборка.
Не нашли, что искали? Воспользуйтесь поиском:
|