- •Программирование эвм
- •Int 21h ;кодом возврата 0 прерывания 21h
- •Работа с битами
- •Порядок выполнения работы
- •Устройства ввода-вывода
- •Ввод исходных данных с клавиатуры и вывод результатов на дисплей
- •Inc di ;смещение в видеопамяти на следующий символ
- •Порядок выполнения работы
- •Контрольные задания
- •Система команд процессора
- •Способы адресации
- •Влияние команд на регистр флагов
- •Расширенные регистры и типы данных процессоров x86
- •Система команд процессоров ia-32 и Intel 64
- •Int 21h ;системного прерывания 21h
- •Использование дальней подпрограммы
- •X dw 0aabBh, 0abbAh, 0baaBh, 0bbaAh ;исходные данные
- •Использование подпрограмм для ввода-вывода
- •Порядок выполнения работы
- •Контрольные задания
- •Дескрипторы
- •Порядок работы процессора в защищенном режиме
- •Использование дальней подпрограммы в защищенном режиме
- •Использование idt. Ввод данных с клавиатуры в защищенном режиме
- •Порядок выполнения работы
Использование дальней подпрограммы в защищенном режиме
В данном примере в защищенном режиме происходит преобразование исходных данных, находящихся в сегменте данных, наложением маски с использованием дальней подпрограммы и вывод результатов на дисплей в двоичном формате.
Глобальная таблица дескрипторов располагается в отдельном сегменте.
;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