Обработка прерываний и исключений в защищённом режиме

Защищенный режим виртуальной адресации как основного режима работы 32-разрядных процессоров. Основные понятия защищенного режима. Использованные API-функции и системные константы. Листинг демонстрационной программы, разработанной на языке Ассемблер.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.05.2014
Размер файла 239,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Оглавление

  • Введение
  • Основные понятия защищенного режима
  • Использованные API-функции и системные константы
  • Демонстрационная программа
  • Демонстрация работы
  • Вывод

защищенный режим виртуальная адресация

Введение

Защищенный режим Protected Mode, более торжественно называемый Protected Virtual Address Mode (защищенный режим виртуальной адресации), является основным режимом работы 32-разрядных процессоров. В этом режиме процессор позволяет адресовать до 4 Гбайт физической памяти, через которые при использовании механизма сегментации могут отображаться до 64 Тбайт виртуальной памяти каждой задачи. Режим виртуального процессора 8086 - Virtual 8086 Mode или V86 - является особым состоянием задачи защищенного режима, в котором процессор функционирует как 8086 с возможностью использования 32-разрядных адресов и операндов.

Защищенный режим появился еще в процессоре 80286, но имел не все возможности, доступные в 32-разрядных процессорах. Приведенное ниже описание защищенного режима применимо и к процессору 80286, но с учетом следующих ограничений:

регистры CRn, DRn и ТRn отсутствуют;

вход в защищенный режим осуществляется только по загрузке MSW с РE=1, выход в реальный - только по аппаратному сбросу;

режима виртуального 8086 нет;

форматы дескрипторов имеют 16-битные поля лимита и 24-битные поля базового адреса, что ограничивает размер сегмента до 64 Кбайт, объем физической памяти не превосходит 16 Мбайт, виртуальной - 1 Гбайт;

обращение к памяти за границей 16 Мбайт приводит к кольцевому "сворачиванию” адреса, - обращение к 17-му мегабайту физически адресует первый (что справедливо и для 386SX);

режимы 32-битных адресов и данных отсутствуют;

блок страничной переадресации отсутствует (физический адрес памяти эквивалентен логическому);

ограничения на операции ввода/вывода накладываются только через IOPL, битовой карты разрешения ввода/вывода нет.

Основные понятия защищенного режима

Защищенный режим предназначен для обеспечения независимости выполнения нескольких задач, что подразумевает защиту ресурсов одной задачи от возможного воздействия другой. Основным защищаемым ресурсом является память, в которой хранятся коды, данные и различные системные таблицы (например, таблица прерываний). Защищать требуется и совместно используемую аппаратуру, обращение к которой обычно происходит через операции ввода/вывода и прерывания. В защищенном режиме процессор аппаратно реализует многие функции защиты, необходимые для построения супервизора многозадачной ОС, в том числе механизм виртуальной памяти.

Рис. 1. Формирование линейного адреса в защищенном режиме

Защита памяти основана на сегментации. Сегмент - это блок пространства памяти определенного назначения. К элементам сегмента возможно обращение с помощью различных инструкций процессора, использующих разные режимы адресации для формирования адреса в пределах сегмента. Максимальный размер сегмента - 4 Гбайт (для процессоров 8086 и 80286 предел был всего 64 Кбайт). Сегменты памяти выделяются задачам операционной системой, но в реальном режиме любая задача может переопределить значение сегментных регистров, задающих положение сегмента в пространстве памяти, и "залезть" в чужую область данных или кода. В защищенном режиме сегменты тоже распределяются операционной системой, но прикладная программа сможет использовать только разрешенные для нее сегменты памяти, выбирая их с помощью селекторов из предварительно сформированных таблиц дескрипторов сегментов.

Процессор может обращаться только к тем сегментам памяти, для которых имеются дескрипторы в таблицах. Механизм сегментации формирует линейный адрес по схеме, приведенной на рис.1. Дескрипторы выбираются с помощью 16-битных селекторов, программно загружаемых в сегментные регистры; формат селекторов приведен на рис.2. Индекс, указывающий номер дескриптора в таблицы, совместно с индикатором таблицы TI позволяет выбрать дескриптор из локальной (TI=1) или глобальной (TI=0) таблицы дескрипторов. Для неиспользуемых сегментных регистров предназначен нулевой селектор сегмента, формально адресующийся к самому первому элементу глобальной таблицы. Попытка обращения к памяти по такому сегментному регистру вызовет исключение. Исключение возникнет и при попытке загрузки нулевого селектора в регистр CS или SS. Поле RPL указывает требуемый уровень привилегий.

Рис. 2. Формат селектора

Дескрипторы представляют собой 8-байтные структуры данных, используемые для определения свойств программных элементов (сегментов, вентилей и таблиц). Дескриптор определяет положение элемента в памяти, размер занимаемой им области (лимит), его назначение и характеристики защиты. Все дескрипторы хранятся в таблицах, обращение к которым поддерживается процессором аппаратно.

Защита памяти с помощью сегментации не позволяет:

использовать сегменты не по назначению (например, пытаться трактовать область данных как коды инструкций);

нарушать права доступа (пытаться модифицировать сегмент, предназначенный только для чтения, обращаться к сегменту, не имея достаточных привилегий, и т.п.);

адресоваться к элементам, выходящим за лимит сегмента;

изменять содержимое таблиц дескрипторов (то есть параметров сегментов), не имея достаточных привилегий.

Защищенный режим предоставляет средства переключения задач. Состояние каждой задачи (значение всех связанных с ней регистров процессора) может быть сохранено в специальном сегменте состояния задачи TSS (Task State Segment), на который указывает селектор в регистре задачи TR. При переключении задач достаточно загрузить новый селектор в регистр задачи, и состояние текущей задачи автоматически сохранится в ее TSS, а в процессор загрузится состояние новой (возможно, ранее прерванной) задачи, и начнется (продолжится) ее выполнение.

Четырехуровневая иерархическая система привилегий предназначена для управления использованием привилегированных инструкций и доступом к дескрипторам. Уровни привилегий нумеруются от 0 до 3, нулевой уровень соответствует максимальным (неограниченным) возможностям доступа и отводится для ядра операционной системы. Уровень 3 имеет самые ограниченные права и обычно предоставляется прикладным задачам. Систему защиты обычно изображают в виде концентрических колец соответствующих уровням привилегий, а сами уровни привилегий иногда называют кольцами защиты. Сервисы, предоставляемые задачам, могут находиться в разных кольцах защиты. Передача управления между задачами контролируется вентилями (Gate), называемыми также шлюзами, проверяющими правила использования уровней привилегий. Через вентили задачи могут получить доступ только к разрешенным им сервисам других сегментов.

Уровни привилегий относятся к дескрипторам, селекторам и задачам.

Кроме того, в регистре флагов имеется поле привилегий ввода/вывода, с помощью которого обеспечивается управление доступом к инструкциям ввода/вывода и управлению флагом прерываний.

Дескрипторы и привилегии являются основой системы защиты, дескрипторы определяют структуры программных элементов (без которых эти элементы невозможно использовать), а привилегии определяют возможность доступа к дескрипторам и выполнения привилегированных инструкций. Любое нарушение защиты приводит к возникновению специальных исключений, обрабатываемых ядром операционной системы.

Механизм виртуальной памяти позволяет любой задаче использовать логическое адресное пространство размером до 64 Тбайт (16К сегментов по 4 Гбайт). Для этого каждый сегмент в своем дескрипторе имеет специальный бит, который указывает на присутствие данного сегмента в оперативной памяти в текущий момент времени. Неиспользуемый сегмент может быть выгружен из оперативной памяти во внешнюю (например, дисковую), о чем делается пометка в его дескрипторе. На освободившееся место из внешней памяти может восстанавливаться содержимое другого сегмента (этот процесс называется свопингом или подкачкой), и в его дескрипторе делается пометка о присутствии в памяти. При обращении задачи к отсутствующему сегменту процессор вырабатывает соответствующее исключение, обработчик которого и заведует виртуальной памятью в операционной системе. Механизм страничной переадресации обеспечивает виртуализацию памяти, адресуемой логическим адресом, на уровне страниц фиксированного размера. После подкачки сегмента (страницы) выполнение задачи продолжается, так что виртуализация памяти для прикладных задач прозрачна (если не принимать во внимание задержку, вызванную подкачкой).

Процессор предоставляет только необходимые аппаратные средства поддержки защиты и виртуальной памяти, а их реальное использование и устойчивость работы программ и самой операционной системы защищенного режима, конечно же, зависят от корректности построения ОС и предусмотрительности ее разработчиков. Хорошо спроектированная операционная система защищенного режима может обеспечить устойчивость ОС даже при некорректном поведении прикладных задач.

Использованные API-функции и системные константы

Список использованных констант и структур

Сообщения:

WM_DESTROYequ2 - Завершить приложение.

WM_CREATEequ1 - Создать окно.

WM_PAINTequ 0FH - Отрисовка окна из буфера.

Стили окна:

CS_VREDRAWequ 1h - Посылка WM_PAINT при изменении размеров окна.

CS_HREDRAWequ 2h

CS_GLOBALCLASS equ 4000h - Класс окна.

WS_OVERLAPPEDWINDOW equ 000CF0000H - Стиль окна.

stylcl equ CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS

DX0 equ 300

DY0 equ 200

Интерфейс:

IDI_ERROR equ 32513 - Иконка.

IDC_ARROW equ 32512 - Курсор.

SW_SHOWNORMAL equ 1 - Режим показа окна.

Компоненты цветов:

RED equ 50

GREEN equ 50

BLUE equ 255

RGBW equ (RED or (GREEN shl 8)) or (BLUE shl 16)

RGBT equ 2 55

Структуры:

WNDCLASS STRUC - Класс окна

CLSSTYLE DD? - Стиль окна

CLWNDPROC DD? - Основная оконная процедура

CLSCBCLSEX DD? - Пространство для данных

CLSCBWNDEX DD? - Пространство для структур

CLSHINST DD? - Определение класса

CLSHICON DD? - Иконка

CLSHCURSOR DD? - Курсор

CLBKGROUND DD? - Фон

CLMENNAME DD? - Имя окна

CLNAME DD? - Имя класса

WNDCLASS ENDS

PAINTSTR STRUC - Окраска клиентской области

hdc DD0 - Указатель на контекст устройства

fErase DD0 - Стирать ли фон при перерисовке?

left DD0 - Координаты прямоугольника

top DD0 - Окна для рисования

right DD 0 - Правая граница

bottom DD 0 - Нижняя граница

fRes DD 0 - Зарезервировано Windows

fIncUp DD 0 - Зарезервировано Windows

Reserv DB 32 dup (0) - Зарезервировано Windows

PAINTSTR ENDS

MSGSTRUCT STRUC - Структура сообщения

MSHWND DD? - Указатель на окно

MSMESSAGE DD? - Сообщение

MSWPARAM DD? - Дополнительная информация

MSLPARAM DD? - Дополнительная информация

MSTIME DD? - Время отправки сообщения

MSPT DD? - Позиция курсора

MSGSTRUCT ENDS

Список использованных API-функций

CreateWindow - Создать окно.

DefWindowProc - Вызывается для сообщений, которые не обрабатываются функцией окна.

DispatchMessage - Вернуть управление Windows с передачей сообщения предназначенному окну.

ExitProcess - Закончить данный процесс со всеми подзадачами (потоками).

GetMessage - Получить очередное сообщение из очереди сообщений данного приложения.

GetModuleHandle - Получить дескриптор приложения.

LoadCursor - Загрузить системный курсор или курсор, определенный в файле ресурсов.

LoadIcon - Загрузить системную иконку или иконку, определенную в файле ресурсов.

PostQuitMessage - Послать текущему приложению сообщение WM_QUIT.

RegisterClass - Зарегистрировать класс окон.

ShowWindow - Показать окно, установить статус показа.

TranslateMessage - Транслировать клавиатурные сообщения в ASCII-коды.

UpdateWindow - Обновить рабочую область окна.

BeginPaint - Получить контекст при получении сообщения WM_PAINT

EndPaint - Удалить контекст, полученный при помощи BeginPaint.

TextOut - Вывести текст в окно.

GetStockObject - Определить дескриптор стандартного объекта.

CreateSolidBrush - Определить кисть.

SetBkColor - Установить цвет фона для вывода текста.

SetTextColor - Установить цвет текста.

MessageBox - Выдать окно сообщения.

InvalidateRect - Перерисовать окно.

Основы вызова API-функций

Функции API в ассемблере вызываются способом, схожим с вызовом в языках высокого уровня. Для этого все передаваемые параметры передаются в стек в обратном порядке.

Например, функция:

SendMessage (

__in HWND hWnd,

__in UINT Msg,

__in WPARAM wParam,

__in LPARAM lParam

);

будет вызвана в ассемблере по следующему шаблону:

include libuser32. lib

EXTERN SendMessageA: NEAR

TEXT DB 'Введите текст',0

HWNDEDT1 DWORD 0

PUSH OFFSET TEXT

PUSH 0

PUSH WM_SETTEXT

PUSH HWNDEDT1

CALL SendMessageA

В таком вызове API функции SendMessage добавляется символ А, указывающий на ANSI-стандарт, символ @ в роли разделителя и число N в конце, обозначающий количество байт информации, которая передается в функцию через стек.

Далее представим, какие параметры передаются для остальных API-функции:

HWND WINAPI SetFocus (

__in_opt HWND hWnd

);

Тип: HWND

Дескриптор окна, которое будет получать ввод с клавиатуры. Если этот параметр равен NULL, нажатия клавиш игнорируются.

HWND WINAPI CreateWindow (

__in_opt LPCTSTR lpClassName, // строка

__in_opt LPCTSTR lpWindowName, // имя окна

__in DWORD dwStyle, // стиль задаваемого окна

__in int x, // первоначальное горизонтально положение окна

__in int y, // первоначальное вертикальное положение окна

__in int nWidth, // ширина

__in int nHeight, // высота

__in_opt HWND hWndParent, // окно владельца создаваемого окна

__in_opt HMENU hMenu, // обращаться к меню

__in_opt HINSTANCE hInstance, // дескриптор

__in_opt LPVOID lpParam // указатель

);

LRESULT WINAPI DefWindowProc (

__in HWND hWnd, // дескриптор окна

__in UINT Msg, // сообщение

__in WPARAM wParam, // дополнительная информация сообщения

__in LPARAM lParam // дополнительная информация сообщения

);

LRESULT WINAPI DispatchMessage (

__in const MSG *lpmsg // указатель на структуру, содержащую сообщение

);

VOID WINAPI ExitProcess (

__in UINT uExitCode // код выхода

);

BOOL WINAPI GetMessage (

__out LPMSG lpMsg, // указатель на MSG структуру

__in_opt HWND hWnd, // дескриптор окна

__in UINT wMsgFilterMin, // целое число из самых низких сообщение значение для поиска

__in UINT wMsgFilterMax // целое значение самого высокого значения сообщения должны быть извлечены.

);

HMODULE WINAPI GetModuleHandle (

__in_opt LPCTSTR lpModuleName // имя загружаемого модуля (либо DLL или EXE-файл), если EXE файл то параметр равен NULL

);

HCURSOR WINAPI LoadCursor (

__in_opt HINSTANCE hInstance, // дескриптор экземпляра модуля

__in LPCTSTR lpCursorName // имя ресурса курсора для загрузки

);

HICON WINAPI LoadIcon (

__in_opt HINSTANCE hInstance,

__in LPCTSTR lpIconName // имя ресурса иконки для загрузки

);

VOID WINAPI PostQuitMessage (

__in int nExitCode // код выхода из приложения

);

ATOM WINAPI RegisterClass (

__in const WNDCLASS *lpWndClass // указатель на WINDCLASS структуры

);

BOOL WINAPI ShowWindow (

__in HWND hWnd, // дескриптор окна

__in int nCmdShow // как окно будет показано на экране

);

BOOL WINAPI TranslateMessage (

__in const MSG *lpMsg // указатель на MSG структуру

);

BOOL UpdateWindow (

__in HWND hWnd // обращается к окну, чтобы быть обновиться

);

HDC BeginPaint (

__in HWND hwnd, // обращается к окну, чтобы перекрасить

__out LPPAINTSTRUCT lpPaint // указатель на PAINTSTRUCT структуру

);

BOOL EndPaint (

__in HWND hWnd, // дескриптор окна, которое было перекращено

__in const PAINTSTRUCT *lpPaint // указатель на PAINTSTRUCT структуру

);

BOOL TextOut (

__in HDC hdc, // дескриптор контекста устройств

__in int nXStart, // координата Х

__in int nYStart, // коорданата Y

__in LPCTSTR lpString, // указатель на строку

__in int cchString // длина строки

);

COLORREF SetBkColor (

__in HDC hdc, // дескриптор контекста устройств

__in COLORREF crColor // новый цвет фона, используется RGB макрос

);

Аналогичным образом задаются структуры. Так, структуре:

typedef struct tagMSG { // msg

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

} MSG;

Соответствует код:

MSGSTRUCT STRUC

MSHWND DD?

MSMESSAGE DD?

MSWPARAM DD?

MSLPARAM DD?

MSTIME DD?

MSPT DD?

MSGSTRUCT ENDS

typedef struct tagWNDCLASS {

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;

} WNDCLASS, *PWNDCLASS;

Соответствует код:

WNDCLASS STRUC

CLSSTYLE DD?

CLWNDPROC DD?

CLSCBCLSEX DD?

CLSCBWNDEX DD?

CLSHINST DD?

CLSHICON DD?

CLSHCURSOR DD?

CLBKGROUND DD?

CLMENNAME DD?

CLNAME DD?

WNDCLASS ENDS

typedef struct tagPAINTSTRUCT { // ps

HDC hdc;

BOOL fErase;

RECT rcPaint;

BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved [32];

} PAINTSTRUCT;

Соответствует код:

PAINTSTR STRUC

hdc DWORD 0

fErase DWORD 0

left DWORD 0

top DWORD 0

right DWORD 0

bottom DWORD 0

fRes DWORD 0

fIncUp DWORD 0

Reserv DB 32 dup (0)

PAINTSTR ENDS

Демонстрационная программа

Листинг:

Файл text1. inc:

; файл text1. inc

; константы

; сообщение приходит при закрытии окна

WM_DESTROY equ 2

; сообщение приходит при создании окна

WM_CREATE equ 1

; сообщение приходит при перерисовке окна

WM_PAINT equ 0FH

; свойства окна

CS_VREDRAW equ 1h

CS_HREDRAW equ 2h

CS_GLOBALCLASS equ 4000h

WS_OVERLAPPEDWINDOW equ 000CF0000H

stylcl equ CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS

DX0 equ 300

DY0 equ 200

; компоненты цветов

RED equ 50

GREEN equ 50

BLUE equ 255

RGBW equ (RED or (GREEN shl 8)) or (BLUE shl 16)

RGBT equ 255; красный

; идентификатор стандартной иконки

IDI_APPLICATION equ 32512

; идентификатор курсора

IDC_CROSS equ 32515

; режим показа окна - нормальный

SW_SHOWNORMAL equ 1

; прототипы внешних процедур

EXTERN CreateWindowExA: NEAR

EXTERN DefWindowProcA: NEAR

EXTERN DispatchMessageA: NEAR

EXTERN ExitProcess: NEAR

EXTERN GetMessageA: NEAR

EXTERN GetModuleHandleA: NEAR

EXTERN LoadCursorA: NEAR

EXTERN LoadIconA: NEAR

EXTERN PostQuitMessage: NEAR

EXTERN RegisterClassA: NEAR

EXTERN ShowWindow: NEAR

EXTERN TranslateMessage: NEAR

EXTERN UpdateWindow: NEAR

EXTERN BeginPaint: NEAR

EXTERN EndPaint: NEAR

EXTERN TextOutA: NEAR

EXTERN GetStockObject: NEAR

EXTERN CreateSolidBrush: NEAR

EXTERN SetBkColor: NEAR

EXTERN SetTextColor: NEAR

EXTERN MessageBoxA: NEAR

; структуры

; структура сообщения

MSGSTRUCT STRUC

MSHWND DD?; идентификатор окна,

; получающего сообщение

MSMESSAGE DD?; идентификатор сообщения

MSWPARAM DD?; доп. информация о сообщении

MSLPARAM DD?; доп. информация о сообщении

MSTIME DD?; время посылки сообщения

MSPT DD?; положение курсора во время

; посылки сообщения

MSGSTRUCT ENDS

WNDCLASS STRUC

CLSSTYLE DD?; стиль окна

CLSLPFNWNDPROC DD?; указатель на процедуру окна

CLSCBCLSEXTRA DD?; информация о доп. байтах для

; данной структуры

CLSCBWNDEXTRA DD?; информация о доп. байтах для окна

CLSHINSTANCE DD?; дескриптор приложения

CLSHICON DD?; идентификатор иконы окна

CLSHCURSOR DD?; идентификатор курсора окна

CLSHBRBACKGROUND DD?; идентификатор кисти окна

MENNAME DD?; имя-идентификатор меню

CLSNAME DD?; специфицирует имя класса окон

WNDCLASS ENDS

PAINTSTR STRUC

hdc DWORD 0

fErase DWORD 0

left DWORD 0

top DWORD 0

right DWORD 0

bottom DWORD 0

fRes DWORD 0

fIncUp DWORD 0

Reserv DB 32 dup (0)

PAINTSTR ENDS

Файл test. asm:

; файл text1. asm

.386P

; плоская модель

. MODEL FLAT, stdcall

; - -----------------------------------------------------------

include text1. inc

; подключения библиотек

includelib import32. lib

; - -----------------------------------------------------------

@TRY_BEGIN MACRO Handler

Pushad; сохраняем текущее состояние

Mov esi, offset Handler; Адрес нового исключения

push esi; сохраняем старое исключение

push dword ptr fs: [0]; устанавливаем новый Handler

Mov dword ptr fs: [0], esp

ENDM

@TRY_EXCEPT MACRO Handler

jmp NoExceptionHandler; исключений нет, делаем переход

Handler:

Mov esp, [esp + 8]; исключение есть, получаем старое значение ESP

pop dword ptr fs: [0]; востанавливаем старое исключение

add esp, 4; значение ESP перед тем, как SEH был установлен

Popad; востанавливаем старое состояние

ENDM

@TRY_END MACRO Handler

Jmp ExceptionHandled&Handler; исключение было обработано

NoExceptionHandler:; исключений нет

pop dword ptr fs: [0]; востанавливаем старое исключение

add esp, 32 + 4; значение ESP перед тем, как SEH был установлен

ExceptionHandled&Handler:

; исключение было обработано, или его вообще не было

ENDM

; сегмент данных

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'

NEWHWND DD 0

MSG MSGSTRUCT <? >

WC WNDCLASS <? >

PNT PAINTSTR <? >

HINST DD 0

TITLENAME DB 'Обработка исключений',0

NAM DB 'CLASS32',0

XT DWORD 30

YT DWORD 5

YT2 DWORD 20

TEXT DB 'Деление на 0',0

SzCaption db ' SEH на Ассме ', 0

SzException db ' Ошибка деления на 0!! ', 0dh, 0ah

db ' Нажмите ОК для завершения ', 0

SzNoException db ' Исключений нет ', 0

_DATA ENDS

; сегмент кода

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

START:

; получить дескриптор приложения

PUSH 0

CALL GetModuleHandleA

MOV [HINST], EAX

REG_CLASS:

; заполнить структуру окна стиль

MOV [WC. CLSSTYLE], stylcl

; процедура обработки сообщений

MOV [WC. CLSLPFNWNDPROC], OFFSET WNDPROC

MOV [WC. CLSCBCLSEXTRA],0

MOV [WC. CLSCBWNDEXTRA],0

MOV EAX, [HINST]

MOV [WC. CLSHINSTANCE],EAX

; иконка окна

PUSH IDI_APPLICATION

PUSH 0

CALL LoadIconA

MOV [WC. CLSHICON], EAX

; - ---------курсор окна

PUSH IDC_CROSS

PUSH 0

CALL LoadCursorA

MOV [WC. CLSHCURSOR],EAX

PUSH RGBW; цвет кисти

CALL CreateSolidBrush; создать кисть

MOV [WC. CLSHBRBACKGROUND],EAX

MOV DWORD PTR [WC. MENNAME],0

MOV DWORD PTR [WC. CLSNAME], OFFSET NAM

PUSH OFFSET WC

CALL RegisterClassA

; создать окно зарегистрированного класса

PUSH 0

PUSH [HINST]

PUSH 0

PUSH 0

PUSH DY0; DY0 - высота окна

PUSH DX0; DX0 - ширина окна

PUSH 100; координата Y

PUSH 100; координата X

PUSH WS_OVERLAPPEDWINDOW

PUSH OFFSET TITLENAME; имя окна

PUSH OFFSET NAM; имя класса

PUSH 0

CALL CreateWindowExA

; проверка на ошибку

CMP EAX, 0

JZ _ERR

MOV [NEWHWND], EAX; дескриптор окна

; - -----------------------------------------------------------

PUSH SW_SHOWNORMAL

PUSH [NEWHWND]

CALL ShowWindow; показать созданное окно

; - -------------------

PUSH [NEWHWND]

CALL UpdateWindow; перерисовать видимую часть окна

; петля обработки сообщений

MSG_LOOP:

PUSH 0

PUSH 0

PUSH 0

PUSH OFFSET MSG

CALL GetMessageA

CMP AX, 0

JE END_LOOP

PUSH OFFSET MSG

CALL TranslateMessage

PUSH OFFSET MSG

CALL DispatchMessageA

JMP MSG_LOOP

END_LOOP:; выход из программы (закрыть процесс)

PUSH [MSG. MSWPARAM]

CALL ExitProcess

_ERR:

JMP END_LOOP

; процедура окна

; расположение параметров в стеке

; [EBP+014Н]; LPARAM

; [EBP+10H]; WAPARAM

; [EBP+0CH]; MES

; [EBP+8]; HWND

WNDPROC PROC

PUSH EBP

MOV EBP,ESP

PUSH EBX

PUSH ESI

PUSH EDI

CMP DWORD PTR [EBP+0CH], WM_DESTROY

JE WMDESTROY

CMP DWORD PTR [EBP+0CH], WM_CREATE

JE WMCREATE

CMP DWORD PTR [EBP+0CH], WM_PAINT

JE WMPAINT

JMP DEFWNDPROC

WMPAINT:

PUSH OFFSET PNT

PUSH DWORD PTR [EBP+08H]

CALL BeginPaint

PUSH EAX; сохранить контекст (дескриптор)

; - ------------- - цвет фона = цвет окна

PUSH RGBW

PUSH EAX

CALL SetBkColor

; - ------------- - контекст

POP EAX

PUSH EAX

; - ------------- - цвет текста (красный)

PUSH RGBT

PUSH EAX

CALL SetTextColor

; - ------------- - контекст

POP EAX

; - ------------- - вывести текст

PUSH OFFSET TEXT

CALL LENSTR

PUSH EBX; длина строки

PUSH OFFSET TEXT; адрес строки

PUSH YT; Y

PUSH XT; X

PUSH EAX; контекст окна

CALL TextOutA

@TRY_BEGIN Zero_Address_Access

Mov Eax, 5

Mov cl, 0

Div cl

@TRY_EXCEPT Zero_Address_Access

call MessageBoxA, 0, offset SzException, offset SzCaption, 0

Jmp ExitProgram

@TRY_END Zero_Address_Access

call MessageBoxA, 0, offset SzNoException, offset SzCaption, 0

ExitProgram:

; - ------------- - закрыть

PUSH OFFSET PNT

PUSH DWORD PTR [EBP+08H]

CALL EndPaint

MOV EAX, 0

JMP FINISH

WMCREATE:

MOV EAX, 0

JMP FINISH

DEFWNDPROC:

PUSH DWORD PTR [EBP+14H]

PUSH DWORD PTR [EBP+10H]

PUSH DWORD PTR [EBP+0CH]

PUSH DWORD PTR [EBP+08H]

CALL DefWindowProcA

JMP FINISH

WMDESTROY:

PUSH 0

CALL PostQuitMessage; WM_QUIT

MOV EAX, 0

FINISH:

POP EDI

POP ESI

POP EBX

POP EBP

RET 16

WNDPROC ENDP

; - -------- - функция - -------------------------

; длина строки

; [EBP+08H] - указатель на строку

LENSTR PROC

PUSH EBP

MOV EBP, ESP

PUSH ESI

MOV ESI, DWORD PTR [EBP+8]

XOR EBX, EBX

LBL1:

CMP BYTE PTR [ESI], 0

JZ LBL2

INC EBX

INC ESI

JMP LBL1

LBL2:

POP ESI

POP EBP

RET 4

LENSTR ENDP

_TEXT ENDS

END START

Файл make. bat:

Tasm32 /ml test. asm

Tlink32 test. obj

Демонстрация работы

Вывод

В ходе курсовой работы были разобраны основы работы процессора в защищённом режиме. Составлена программа на языке ассемблера для 32 разрядных микропроцессоров семейства Intel, демонстрирующая обработку исключения в защищённом режиме ОС Windows.

Размещено на Allbest.ru

...

Подобные документы

  • Принципы и алгоритмы обработки прерываний. Набор действий по реализации этапов обработки прерываний микропроцессора. Разработка структуры и алгоритма резидентной программы. Реализация программы на языке Ассемблер, методы её отладки и тестирования.

    курсовая работа [348,7 K], добавлен 22.12.2014

  • Исследование общих принципов программирования на языке Assembler для 32-х разрядных и 64-х разрядных процессоров. Изучение основных отличий архитектур i686 и amd64. Работа со стеком. Передача параметров в функции. Смена способа адресации внутри программы.

    контрольная работа [118,2 K], добавлен 10.02.2015

  • Прерывание и его природа. Контролер прерываний. Обработка прерываний в реальном режиме. Характеристики реального режима работы микропроцессора. Схема обработки прерываний в реальном режиме. Написание собственного прерывания. Разработка в общем случае.

    доклад [347,0 K], добавлен 22.09.2008

  • Обработка прерываний - сигналов о совершении некоторых событий в компьютере. Механизм обработки прерываний. Обработка исключений, описание реакции программы на ошибки выполнения. Общее понятие и виды исключительных ситуаций во время выполнения программы.

    реферат [192,2 K], добавлен 10.11.2014

  • Написание алгоритма приема 10 пакетов по 12 байт из последовательного порта и размещение их в памяти PRAM. Создание управляющего блока PTSCB для режима блоковой передачи данных. Аппаратная обработка прерываний в режима аналого-цифрового сканирования.

    практическая работа [2,0 M], добавлен 25.04.2012

  • Предотвращение или выявление ошибочных ситуаций в ходе выполнения программы. Стандартная обработка исключений, программные средства. Назначение программных блоков try, catch, final. Главные особенности конфигурирования исключений с помощью флажков.

    лекция [387,6 K], добавлен 09.12.2013

  • Функциональная схема микропроцессора Intel 8086 (i8086). Формирование физического адреса памяти, выборка команд из памяти и запись их в очередь команд. Система команд процессора. Суть защищенного режима, переход из защищенного режима в реальный режим.

    практическая работа [93,3 K], добавлен 24.03.2013

  • Организация центрального процессора. Подключение интерфейсных программируемых БИС. Методы адресации и примеры команд. Программирование таймера и контроллера прерываний. Программная модель микропроцессорной системы. Программирование на языке ассемблера.

    реферат [82,6 K], добавлен 05.12.2010

  • Анализ технического задания. Разработка программы по вычислению функции на языке ассемблер для микропроцессора Кр580ВМ80. Алгоритмы программного умножения, деления, сложения, вычитания и сдвига влево многобайтных чисел. Расчет времени работы программы.

    курсовая работа [88,2 K], добавлен 19.09.2012

  • Краткий обзор процессоров фирмы intel. Основные характеристики i80286: режим реальной адресации, режим защиты, сопроцессор i80287, условия программирования i80287. Основные характеристики i80386: 32-битная архитектура, способы адресации.

    курсовая работа [29,9 K], добавлен 23.06.2007

  • Ввод и вывод чисел при помощи подключаемого модуля IO. Особенности работы с одномерными и двухмерными массивами. Тестирование состояние флагов. Рринципы и навыки работы с компилятором и отладчиком. Разработка схемы алгоритма программы на языке ассемблер.

    курсовая работа [1,3 M], добавлен 02.12.2009

  • C++ как универсальный язык программирования, его сущность, назначение, классы и возможности. Блок-схема и листинг программы KURS.EXE, ее принцип работы, системные требования, возможные неполадки и способы их устранения. Листинг заставки VOVA777.EXE.

    курсовая работа [422,3 K], добавлен 31.05.2010

  • Решение алгоритма головоломок с помощью разработанной программы "Дешифратор", написанной на языке C++ в среде Builder. Два режима работы программы: разные буквы соответствуют обязательно разным цифрам и разные буквы могут обозначать и одинаковые цифры.

    курсовая работа [188,7 K], добавлен 09.02.2011

  • Разработка программы обработки числовых последовательностей с кодом на языке Pascal. Функции ввода пользователем с клавиатуры последовательности целых чисел. Алгоритмы разработанных процедур и функций. Инструкция пользователя, листинг программы.

    курсовая работа [677,7 K], добавлен 13.07.2010

  • Сведения о интерполяторе. Принцип работы схемы сложения и вычитания единицы. Выбор элементной базы. Расчет эквивалентной передаточной функции схемы. Создание программы в коде ISO 7bit и ее реализация на низкоуровневом языке программирования Ассемблер.

    курсовая работа [363,2 K], добавлен 15.04.2014

  • Понятие и общая характеристика языка программирования РНР, принципы и этапы его работы, синтаксис и ассоциируемые массивы. Обработка исключений в языке Java. Работа с базами данных с помощью JDBC. Изучение порядка разработки графического интерфейса.

    презентация [192,3 K], добавлен 13.06.2014

  • Описание авторской идеи анимации, использования базовых команд и конструкций. Процесса проектирования программы. Описание алгоритма разработанной программы. Последовательность создания анимации. Листинг программы и скриншот рисунка по программе.

    курсовая работа [911,5 K], добавлен 20.05.2013

  • Анализ задания и разработка алгоритма. Основные принципы создания программы. Схема взаимодействия процессов Process 1 и Process 4, в режиме задачи и в режиме ядра. Листинг программы и ее тестирование. Результат работы и выполнения программы в консоли.

    контрольная работа [395,9 K], добавлен 18.09.2010

  • Выбор режимов адресации, посредством которых будет осуществлен доступ к данным. Этапы создания программы. Характеристика таблицы символов и полученного файла листинга. Анализ изменения состояния регистра IP при выполнении команд JMP, Jcc, LOOPx.

    курсовая работа [4,9 M], добавлен 25.03.2012

  • Основные структуры в языке С. Обращение к элементам структуры. Типичные ошибки при разработке структуры. Алгоритм определения продолжительности полета. Описание функции int fflush. Алгоритм работы файла run.cpp. Листинг разрабатываемой программы.

    курсовая работа [990,9 K], добавлен 16.02.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.