Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
20.06.2014
Размер:
1.08 Mб
Скачать

Использование дальней подпрограммы в защищенном режиме

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

Глобальная таблица дескрипторов располагается в отдельном сегменте.

;PM3O_PFG.asm

;пpогpамма выполняет наложение маски и вывод pезультата в защищенном pежиме

;для наложения маски используется дальняя подпpогpамма

;GDT pасполагается в отдельном сегменте

;tasm /m PM3O_PFG.asm

;tlink /3 PM3O_PFG.obj

.386p ;чтобы можно было использовать системные команды IA-32

;сегмент стека 16-битный в pеальном pежиме и 32-битный в защищенном

SSeg segment stack

Sbegin db 100h dup(?)

Ssize = $ - Sbegin ;размер стека для инициализации указателя стека

SSeg ends

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

DSeg32 segment use32

X dd 0AAAABBBBh, 0BBBBAAAAh ;исходные данные

Y dd 2 dup(0FFFFFFFFh) ;результаты

M dd 0000FFFFh, 0FFFF0000h ;маска

DSeg32 ends

;Глобальная таблица дескрипторов

GDT_Seg segment use32

GDT label byte

db 8 dup(0) ;дескриптор 0

CS16Dsc db 0FFh,0FFh,0,0,0,10011010b,0,0 ;дескриптор 1

CS32Dsc db 0FFh,0FFh,0,0,0,10011010b,11001111b,0 ;дескриптор 2

DS32Dsc db 0FFh,0FFh,0,0,0,10010010b,11001111b,0 ;дескриптор 3

SS32Dsc db 0FFh,0FFh,0,0,0,10010010b,11001111b,0 ;дескриптор 4

VSegDsc db 0FFh,0FFh,0,80h,0Bh,10010010b,11001111b,0 ;дескриптор 5 (Video)

GDT_Dsc db 0FFh,0FFh,0,0,0,10010010b,11001111b,0

CSPrDsc db 0FFh,0FFh,0,0,0,10011010b,11001111b,0

GDT_l = $-GDT ;длина GDT

;переменная, значение которой загружается в GDTR

gdtr dw GDT_l-1 ;лимит GDT

dd ? ;база GDT

CS16Sel equ 0000000000001000b ;селектор дескриптора 1

CS32Sel equ 0000000000010000b ;селектор дескриптора 2

DS32Sel equ 0000000000011000b ;селектор дескриптора 3

SS32Sel equ 0000000000100000b ;селектор дескриптора 4

VSegSel equ 0000000000101000b ;селектор дескриптора 5

GDT_Sel equ 0000000000110000b

CSPrSel equ 0000000000111000b

GDT_Seg ends

;сегмент кода, котоpый начинает выполняться после запуска пpогpаммы, в pеальном pежиме

CSeg16 segment use16

assume CS:CSeg16, DS:GDT_Seg, SS:SSeg

;точка входа в программу, инициализация DS

start: push GDT_Seg

pop ds

;включается адресная линия A20

in al, 92h

or al, 2

out 92h, al

;рассчитываются и заполняются поля базы дескрипторов сегментов

xor eax, eax

mov ax, cs

shl eax, 4

mov word ptr CS16Dsc+2, ax

shr eax, 16

mov byte ptr CS16Dsc+4, al

mov ax, CSeg32

shl eax, 4

mov word ptr CS32Dsc+2, ax

shr eax, 16

mov byte ptr CS32Dsc+4, al

mov ax, DSeg32

shl eax, 4

mov word ptr DS32Dsc+2, ax

shr eax, 16

mov byte ptr DS32Dsc+4, al

mov ax, SSeg

shl eax, 4

mov word ptr SS32Dsc+2, ax

shr eax, 16

mov byte ptr SS32Dsc+4, al

mov ax, GDT_Seg

shl eax, 4

push eax

mov word ptr GDT_Dsc+2, ax

shr eax, 16

mov byte ptr GDT_Dsc+4, al

mov ax, CSegPr

shl eax, 4

mov word ptr CSPrDsc+2, ax

shr eax, 16

mov byte ptr CSPrDsc+4, al

;рассчитывается линейный адрес начала GDT (база GDT),

;заполняется соответствующее поле переменной gdtr

pop eax

add eax, offset GDT

mov dword ptr gdtr+2, eax

;загружается регистр GDTR значением одноименной переменной

lgdt fword ptr gdtr

;запрещаются маскируемые прерывания

cli

;устанавливается бит PE - процессор с этого момента в защищенном режиме

mov eax, cr0

or al, 1

mov cr0, eax

;JMP в код защищенного режима

db 66h

db 0EAh

dd offset PMentry

dw CS32Sel

;точка возврата из кода защищенного режима, сбрасывается бит PE,

;процессор оказывается в реальном режиме

RMret: mov eax, cr0

and al, 0FEh

mov cr0, eax

db 0EAh

dw $+4

dw CSeg16

;установка стека pеального pежима

mov dx, SSeg

mov ss, dx

mov sp, SSize

;разрешаются маскируемые прерывания

sti

;ожидание нажатия на клавишу

mov ah, 0

int 16h

;завершение работы программы

mov ah, 4Ch

int 21h

CSeg16 ends

CSegPr segment use32

assume cs:CSegPr, ds:DSeg32

;подпpогpамма наложения маски

maskp proc ;начало подпрогpаммы наложения маски

mov ebp, esp ;указателю базы присваивается значение указателя стека

add ebp, 12 ;тепеpь BP указывает на кадp паpаметpов

mov ebx, [ebp] ;в BX передается исходное значение

mov eax, [ebp-4] ;в аккумулятор передается маска

and eax, ebx ;маска накладывается на исходное значение

ret 2*4 ;возврат из подпрограммы с очисткой стека

maskp endp ;конец подпрограммы наложения маски

CSegPr ends

;сегмент кода защищенного режима

CSeg32 segment use32

assume cs:CSeg32, ds:DSeg32

;точка входа в код защищенного режима

PMentry:

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

mov dx, DS32Sel

mov ds, dx

mov es, dx

mov dx, SS32Sel

mov ss, dx

mov esp, Ssize

mov esi, offset X

mov edi, offset Y

mov ecx, 2

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

mloop: lodsd

push eax

push M[esi-4]

; call maskp

db 9Ah

dd offset maskp

dw CSPrSel

stosd

loop mloop

;инициализация ES и EDI для вывода результатов на экран

mov dx,VSegSel

mov es,dx

xor edi, edi

;очистка экрана

mov eax, 07200720h

mov ecx, 80*25*2/4

rep stosd

;инициализация ESI и EDI для вывода результатов на экран

mov esi, offset Y

xor edi, edi

mov ecx, 2

;цикл вывода результатов на экран

obloop: lodsd

mov ebx, 80000000h

olloop: test eax, ebx

jnz bit1

mov word ptr es:[edi], 0730h

jmp NxtBit

bit1: mov word ptr es:[edi], 0731h

NxtBit: inc edi

inc edi

shr ebx, 1

jnc olloop

mov word ptr es:[edi], 0720h

inc edi

inc edi

loop obloop

;JMP в код реального режима

db 0EAh

dd offset RMret

dw CS16Sel

CSeg32 ends

end start

Соседние файлы в папке Задания к лабораторным