48836 (Робота в захищеному режимі мікропроцесора), страница 3

2016-07-30СтудИзба

Описание файла

Документ из архива "Робота в захищеному режимі мікропроцесора", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "48836"

Текст 3 страницы из документа "48836"

2:s:='AMD-K-PR120,166';

end;

6: case model of

1:s:='Pentium Pro';

3:if typ=0 then s:='Pentium II модель 3'

else s:='Pentium II OverDrive';

5:case desc_L2 of

$41:s:='Celeron модель 5';

$43:s:='Pentium II модель 5';

$44:s:='Pentium II Xeon модель 5';

end;

6:s:='Celeron модель 6';

7:case desc_L2 of

$43: s:='Pentium III модель 7';

$44,$45:s:='Pentium III Xeon модель 7';

end;

8:case brand of

1:s:='Celeron модель 8';

2:s:='Pentium III модель 8';

3: if sn_3=$6B1 then s:='Celeron модель 8'

else s:='Pentium III Xeon модель 8';

4: s:='Pentium III модель 8';

6: s:='Мобильный Pentium III-M модель 8';

7: s:='Мобильный Celeron модель 8';

end;

$A:s:='Pentium III Xeon модель A';

$B:s:='Pentium III Xeon модель B';

else unknown:=true

end;

$F:case model of

0: begin

s:='0.18-микронный ';

case brand of

8: s:=s+'Pentium 4';

9: s:=s+'Pentium 4';

$B: s:=s+'Xeon';

end;

end;

1: begin

s:='0.18-микронный ';

case brand of

8: s :=s+'Pentium 4';

9: s:=s+'Pentium 4';

$A: s:=s+'Celeron';

$B: if sn_3<$F13 then s:=s+'Xeon MP'

else s:=s+'Xeon';

$C: s:=s+'Xeon MP';

$E: s:=s+'Xeon';

end;

end;

2: begin

s:='0.13-микронный ';

case brand of

8: s:=s+'Pentium 4';

9: s:=s+'Pentium 4';

$A: s:=s+'Celeron';

$B: if sn_3<$F13 then s:=s+'Xeon MP'

else s:=s+'Xeon';

$C: s:=s+'Xeon MP';

$E: if sn_3<$F13 then s:=s+'Xeon'

else s:=s+'мобильный Pentium 4-M';

$F: s:=s+'мобильный Celeron';

end

end

end {else unknown:=true}

end;

for i:=1 to 12 do write(vend[i]);

if not unknown then writeln(' ',s)

else writeln('МП сiмейства - ',cpu_type, ' модель - ',model);

asm

db 66h,0b8h

dd 80000000h { MOV EAX,80000000h }

db 0fh,0a2h { CPUID }

db 66h

mov word ptr max_inp,ax

end;

if max_inp>$80000000 then begin

asm

db 66h,0b8h { MOV EAX,80000002h }

dd 80000002h

db 0fh,0a2h { CPUID }

db 66h

mov ss:[bp+offset brand_str],ax { Из pегистpов EAX, }

db 66h

mov ss:[bp+offset brand_str+4],bx { EBX, }

db 66h

mov ss:[bp+offset brand_str+8],cx { ECX }

db 66h

mov ss:[bp+offset brand_str+12],dx { и EDX }

{в переменную brand_str заносятся первые 12 символов бренд-строки}

db 66h,0b8h

dd 80000003h { MOV EAX,80000003h }

db 0fh,0a2h { CPUID }

db 66h

mov ss:[bp+offset brand_str+16],ax

db 66h

mov ss:[bp+offset brand_str+20],bx

db 66h

mov ss:[bp+offset brand_str+24],cx

db 66h

mov ss:[bp+offset brand_str+28],dx

db 66h,0b8h { MOV EAX,80000004h }

dd 80000004h

db 0fh,0a2h { CPUID }

db 66h

mov ss:[bp+offset brand_str+32],ax

db 66h

mov ss:[bp+offset brand_str+36],bx

db 66h

mov ss:[bp+offset brand_str+40],cx

db 66h

mov ss:[bp+offset brand_str+44],dx

end;

for i:=1 to 48 do write(brand_str[i]);

writeln;

end;

if inf<>0 then begin

writeln('Особенности микропроцессора:');

for i:=0 to 21 do

if not ((i=10) or (i=20) or (i=28)) then begin

s:='';

case i of

0:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'содержит FPU';

end;

1:begin

if (feature shr i) and 1=0 then s:='не ';

s:='поддерживает расширения для режима ';

s:=s+'виртуального 8086';

end;

2:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает рассширенную отладку и CR4.DE';

end;

3:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает страницы 4 МБ';

end;

4:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает команду RDTSC и CR4.TSD';

end;

5:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает команды RDMSR и WRMSR';

end;

6:begin

if (feature shr i) and 1=0 then s:='не ';

s:='поддерживает расширение физического адреса';

s:=s+' и CR4.PAE';

end;

7:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает исключение 18 (MCE) и CR4.MCE';

end;

8:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает команду CMPXCHG8B';

end;

9:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'содержит APIC';

end;

11:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает команды SYSENTER и SYSEXIT';

end;

12:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает регистры MTRR';

end;

13:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает глобальные страницы и CR4.PGE';

end;

14:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает MCA и регистр MCG_CAP';

end;

15:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает команды CMOV, FCMOV и FCOMI';

end;

16:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает таблицу атрибутов страниц PAT';

end;

17:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+ 'поддерживает 4 Мб страницы и адреса более 4 Гб';

end;

18:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает 96-разрядный серийный номер МП';

end;

19:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает команду CLFLUSH';

end;

21:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает запись истории переходов';

end;

end;

writeln(' ',s);

end;

readkey;

clrscr;

writeln('Особенности микропроцессора:');

for i:=22 to 31 do

if i<>30 then begin

s:='';

case i of

22:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает программный контроль частоты МП';

end;

23:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает MMX команды';

end;

24:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает команды FXSAVE и FXRSTOR';

end;

25:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает команды SSE';

end;

26:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает команды SSE2';

end;

27:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает разрешение конфликтов памятi';

end;

28:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+' поддерживает логические процессоры и HT';

end;

29:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'поддерживает температурный мониторинг';

end;

31:begin

if (feature shr i) and 1=0 then s:='не ';

s:=s+'пiдтримує переривання по FERR';

end;

end;

writeln(' ',s);

end;

readkey; clrscr;

if par>1 then begin

writeln('Число повторений команды CPUID с EAX=2 - ',

data_cach[1,1]);

writeln('МП имеет следующие блоки кэш-памяти:');

writeln;

for i:=1 to 4 do

for j:=1 to 4 do

if (i<>1) or (j<>1) then

if data_cach[i,4] and 128=0 then begin

s:='';

if data_cach[i,j]<>0 then begin

case data_cach[i,j] of

1:s:='TLB команд: 4 Кб страницы, 4-напр., 32 входа';

2:s:='TLB команд: 4 Мб стран., полностью ассоц., 2 входа';

3:s:='TLB данных: 4 Кб страницы, 4-напр., 64 входа';

4:s:='TLB данных: 4 Мб страницы, 4-напр., 8 входов';

6:s:='Кэш команд: 8 Кб, 4-напр., строка 32 байта';

8:s:='Кэш команд: 16 Кб, 4-напр., строка 32 байта';

$A:s:='Кэш данных: 8 Кб, 2-напр., строка 32 байта';

$C:s:='Кэш данных: 16 Кб, 4-напр., строка 32 байта';

$22:s:=' Объедин. кэш L3: 512 Кб, 4-напр., строка 64 байта';

$23:s:=' Объедин. кэш L3: 1 Мб, 8-напр., строка 64 байта';

$25:s:=' Объедин. кэш L3: 2 Мб, 8-напр., строка 64 байта';

$29:s:=' Объедин. кэш L3: 4 Мб, 8-напр., строка 64 байта';

$39:s:='Объедин. кэш L2: 128 Кб, 4-напр., строка 64 байта';

$3B:s:='Объедин. кэш L2: 128 Кб, 2-напр., строка 64 байта';

$3C:s:='Объедин. кэш L2: 256 Кб, 4-напр., строка 64 байта';

$40:if cpu_type=6 then s:='Кэш L2: не содержится'

else if cpu_type=$f then s:='Кэш L3: не содержится';

$40:s:='Нет кэша L2 (семейство P6) или L3 (Pentium 4)';

$41:s:='Объедин. кэш: 128 Кб, 4-напр., строка 32 байта';

$42:s:='Объедин. кэш: 256 Кб, 4-напр., строка 32 байта';

$43:s:='Объедин. кэш: 512 Кб, 4-напр., строка 32 байта';

$44:s:='Объедин. кэш: 1 Мб, 4-напр., строка 32 байта';

$45:s:='Объедин. кэш: 2 Мб, 4-напр., строка 32 байта';

$50:begin

s:='TLB команд: 4 Кб,2 Мб или 4 Мб страницы,';

s:=s+'полностью ассоц., 64 входа';

end;

$51:begin

s:='TLB команд: 4 Кб, 2 Мб або 4 Мб страницы,';

s:=s+'полностью ассоц., 128 входов';

end;

$52:begin

s:='TLB команд: 4 Кб, 2 Мб або 4 Мб страницы,';

s:=s+'полностью ассоц., 256 входов';

end;

$5b:begin

s:='TLB данных: 4 Кб или 4 Мб страницы.,';

s:=s+'полностью ассоц., 64 входа';

end;

$5C:begin

s:='TLB команд: 4 Кб або 4 Мб страницы.,';

s:=s+'полностью ассоц., 128 входов';

end;

$5D:begin

s:='TLB команд: 4 Кб або 4 Мб страницы.,';

s:=s+'полностью ассоц., 256 входов';

end;

$66:s:='Кэш данных секторный:8 Кб, 4-напр., строка 64 байта';

$67:s:='Кэш данных секторный: 16 Кб, 4-напр., строка 64 байти';

$68:s:='Кэш данных секторный: 32 Кб, 4-напр., строка 64 байти';

$70:s:='Кэш трас команд: 12 К микроинструкций, 4-напр.';

$71:s:='Кэш трас команд: 16 К микроинструкций, 8-напр. ';

$72:s:='Кэш трас команд: 32 К микроинструкций, 8-напр. ';

$79:begin

s:='Объедин. кэш секторный: 128 Кб, 8-напр.,';

s:=s+' строка 64 байта'

end;

$7A:begin

s:='Объедин. кэш секторный: 256 Кб, 8-напр.,';

s:=s+' строка 64 байта'

end;

$7B:begin

s:='Объедин. кэш секторный: 512 Кб, 8-напр.,';

s:=s+' строка 64 байта'

end;

$7C:begin

s:='Объедин. кэш секторный: 1 Мб, 8-напр.,';

s:=s+' строка 64 байта'

end;

$82:s:='Объедин. кэш: 256 Кб, 8-напр., строка 32 байта';

$83:s:='Объедин. кэш: 512 Кб, 8-напр., рядок 32 байти';

$84:s:='Объедин. кэш: 1 Мб, 8-напр., строка 32 байта';

$85:s:='Объедин. кэш: 2 Мб, 8-напр., строка 32 байта';

else begin

write(' Дескриптор: ',hex(data_cach[i,j]));

s:=''

end

end;

writeln(' ',s);

end

end

end;

if (feature shr 18) and 1<>0 then begin

asm

db 66h,0b8h { MOV EAX,3 }

dd 3 { CPUID с параметром 3: определение }

db 0fh,0a2h { серийного номера микропроцессора }

db 66h { В sn_2 - средние 32 разряда }

mov word ptr sn_2,dx { серийного номера МП }

db 66h { В sn_1 - младшие 32 разряда }

mov word ptr sn_1,cx { серийного номера МП }

end;

writeln('Серийный номер микропроцессора: ',

hw(sn_3 shr 16),'-',hw(word(sn_3)),'-',

hw(sn_2 shr 16),'-',hw(word(sn_2)),'-',

hw(sn_1 shr 16),'-',hw(word(sn_1)));

end;

end

end;

asm { Возврат значения параметра cpu: }

mov bx,ss:[bp+offset cpu] { В BX - адрес cpu }

mov al,cpu_type

mov [bx],al

end;

end; {get_cpu_type}

{--------Обработчики исключений 0-18 (exc_00-exc_18)----------}

{------------выводят на экран номер исключения----------------}

{--------и осуществляют переход в реальный режим:-------------}

procedure exc_00;assembler; { Обработчик исключения 0: }

asm { деление на 0 }

mov excep,0

int 32h { Вывод номера исключения }

cmp cpu_type,2

jz @1

db 0ffh,2eh { Межсегментный переход }

dw ofs_ret_mov { на метку ret_mov: }

@1:db 9ah { Межсегментный вызов }

dw offset reset { процедуры сброса МП reset }

dw code_sel2 { с переходом на метку ret_r }

end;

procedure exc_01;assembler; { Обработчик исключения 1: }

asm { - при TF=1 регистра EFLAGS; }

mov excep,1 { - при T=1 сегмента TSS; }

int 32h { - по контрольным точкам программы; }

cmp cpu_type,2 { - по контрольным точкам данных; }

jz @1 { - по контрольным точкам УВВ; }

db 0ffh,2eh { - при защите регистров отладки }

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_02;assembler; { Обработчик исключения 2: }

asm { немаскируемое прерывание (NMI) }

mov excep,2

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_03;assembler; { Обработчик исключения 3: }

asm { по команде INT 3 }

mov excep,3

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_04;assembler; { Обработчик исключения 4: }

asm { по команде INTO при OF=1 }

mov excep,4

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_05;assembler; { Обработчик исключения 5: }

asm { выход за пределы диапазона }

mov excep,5 { при выполнении команды BOUND }

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_06;assembler; { Обработчик исключения 6: }

asm { неверный код операции }

mov excep,6 { или адресации }

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_07;assembler; { Обработчик исключения 7: }

asm { недоступно устройство FPU }

mov excep,7

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_08;assembler; { Обработчик исключения 8: }

asm { двойная ошибка }

mov excep,8

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_10;assembler; { Обработчик исключения 10: }

asm { недоступен TSS }

mov excep,10

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_11;assembler; { Обработчик исключения 11: }

asm { недоступен сегмент }

mov excep,11

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_12;assembler; { Обработчик исключения 12: }

asm { ошибка доступа к сегменту стека }

mov excep,12

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_13;assembler; { Обработчик исключения 13: }

asm { нарушение общей защиты }

mov excep,13

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_14;assembler; { Обработчик исключения 14: }

asm { недоступна страница }

mov excep,14

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_16;assembler; { Обработчик исключения 16: }

asm { ошибка FPU при NE=1 регистра CR0 }

mov excep,16

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_17;assembler; { Обработчик исключения 17: }

asm { ошибка выравнивания данных }

mov excep,17

int 32h

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

procedure exc_18;assembler; { Обработчик исключения 18: }

asm { ошибка функционирования узлов МП и МПС }

mov excep,18

cmp cpu_type,2

jz @1

db 0ffh,2eh

dw ofs_ret_mov

@1:db 9ah

dw offset reset

dw code_sel2

end;

{---------Обработчики-заглушки аппаратных прерываний,---------}

{----------поступающих на 1-й контроллер прерываний-----------}

procedure PIC_1;assembler;

asm

push ax

mov al,$20

out $20,al { Сброс бита регистра ISR 1-го ПКП }

pop ax

cmp cpu_type,2 { Если 80286 - разрядность 16, }

je @7 { иначе - 32 }

db 66h

@7:iret

end;

{---------Обработчики-заглушки аппаратных прерываний,---------}

{----------поступающих на 2-й контроллер прерываний-----------}

procedure PIC_2;assembler;

asm

push ax

mov al,$20 { Сброс бита регистра ISR }

out $20,al { 1-го и }

out $a0,al { и 2-го контроллеров прерываний }

pop ax

cmp cpu_type,2

je @8

db 66h

@8:iret

end;

procedure keyb;assembler; { Обработчик прерываний }

asm { от клавиатуры: }

mov al,20h

out 20h,al

in al,60h { Чтение скан-кода нажатия/отжатия клавиши }

test al,$80

jnz @k1 { Переход, если клавиша отжата }

mov scan,al

@k1:cmp cpu_type,2

je @k2

db 66h

@k2:iret

end;

procedure int_30h;assembler; { Обработчик программного }

asm { прерывания 30h: }

cmp ah,2 { AH - номер функции }

jz @i2 { Al - номер подфункции }

cmp ah,3 { BL - номер строки экрана }

jz @i3 { BH - номер столбца экрана }

cmp ah,4 { DL/DX/EDX - значение данных }

jz @i4 { (байта/слова/двойного слова) }

cmp ah,5 { CL - видео-атрибут }

jz @i5 { SI - смещение строки символов }

{ Функция 1: установка маркера в заданную точку экрана }

mov ax,bx

xor bh,bh

mov bl,ah

xor ah,ah

mov dl,80

mul dl

add ax,bx

shl ax,1

mov di,ax

jmp @end

@i2: { Функция 2: вывод символа на экран }

mov al,dl

mov ah,cl

stosw

jmp @end

@i3: { Функция 3: вывод данных на экран в 16-ричной форме }

{ AL=0 - вывод байта }

{ AL=1 -вывод слова }

{ AL=2 - вывод двойного слова }

lea bx,hex_tabl

mov ah,cl

cmp al,0

jz @8

cmp al,1

jz @16

add di,14

mov cx,8

jmp @1

@8:add di,2

mov cx,2

jmp @1

@16:add di,6

mov cx,4

@1:push cx

@lp:mov al,dl

and al,0fh

db 66h

shr dx,4

xlat

stosw

sub di,4

loop @lp

pop cx

shl cx,1

add cx,4 {2}

add di,cx

jmp @end

@i4: { Функция 4: вывод строки символов на экран }

mov ah,cl

mov bx,si

inc si

mov cl,[bx]

xor ch,ch

@wxy:

lodsb

stosw

loop @wxy

jmp @end

@i5: { Функция 5: вывод данных на экран в двоичной форме }

{ AL=0 - вывод байта }{ AL=1 -вывод слова }

{ AL=2 - вывод двойного слова }

{ lea bx,duo_tabl}

mov ah,cl

cmp al,0

jz @8_2

cmp al,1

jz @16_2

mov cx,8

jmp @2

@8_2:

mov cx,2

jmp @2

@16_2:

mov cx,4

@2:push cx

push cx

shl cx,3

sub cx,2

add di,cx { di+cx*8-2 }

pop cx

@lp_1:push cx

xor ah,8

mov cx,4

@lp_2:mov al,dl

and al,01h

db 66h

shr dx,1

xlat

stosw

sub di,4

loop @lp_2

pop cx

loop @lp_1

pop cx

shl cx,3

add cx,2 { di+cx*8+2 }

add di,cx

@end:db 66h

iret

end;

procedure int_30hr;assembler; { Обработчик программного }

asm { прерывания 30h: }

cmp ah,2 { AH - номер функции }

jz @i2 { Al - номер подфункции }

cmp ah,3 { BL - номер строки экрана }

jz @i3 { BH - номер столбца экрана }

cmp ah,4 { DL/DX/EDX - значение данных }

jz @i4 { (байта/слова/двойного слова) }

cmp ah,5 { CL - видео-атрибут }

jz @i5 { SI - смещение строки символов }

{ Функция 1: установка маркера в заданную точку экрана }

mov ax,bx

xor bh,bh

mov bl,ah

xor ah,ah

mov dl,80

mul dl

add ax,bx

shl ax,1

mov di,ax

jmp @end

@i2: { Функция 2: вывод символа на экран }

mov al,dl

mov ah,cl

stosw

jmp @end

@i3: { Функция 3: вывод данных на экран в 16-ричной форме }

{ AL=0 - вывод байта } { AL=1 -вывод слова }

{ AL=2 - вывод двойного слова }

lea bx,hex_tabl

mov ah,cl

cmp al,0

jz @8

cmp al,1

jz @16

add di,14

mov cx,8

jmp @1

@8:add di,2

mov cx,2

jmp @1

@16:add di,6

mov cx,4

@1:push cx

@lp:mov al,dl

and al,0fh

db 66h

shr dx,4

xlat

stosw

sub di,4

loop @lp

pop cx

shl cx,1

add cx,4 {2}

add di,cx

jmp @end

@i4: { Функция 4: вывод строки символов на экран }

mov ah,cl

mov bx,si

inc si

mov cl,[bx]

xor ch,ch

@wxy:

lodsb

stosw

loop @wxy

jmp @end

@i5: { Функция 5: вывод данных на экран в двоичной форме }

{ AL=0 - вывод байта }

{ AL=1 -вывод слова }

{ AL=2 - вывод двойного слова }

{ lea bx,duo_tabl}

mov ah,cl

cmp al,0

jz @8_2

cmp al,1

jz @16_2

mov cx,8

jmp @2

@8_2:

mov cx,2

jmp @2

@16_2:

mov cx,4

@2:push cx

push cx

shl cx,3

sub cx,2

add di,cx { di+cx*8-2 }

pop cx

@lp_1:push cx

xor ah,8

mov cx,4

@lp_2:mov al,dl

and al,01h

db 66h

shr dx,1

xlat

stosw

sub di,4

loop @lp_2

pop cx

loop @lp_1

pop cx

shl cx,3

add cx,2 { di+cx*8+2 }

add di,cx

@end: iret

end;

{------------------Вывод номера исключения--------------------}

procedure int_32h;assembler;

asm

mov ah,1 { Функция 1: установка маркера на экране }

mov bl,22 { с координатами - строка 22, }

mov bh,1 { столбец 1 }

int 30h

mov ah,4 { Функция 4: вывод на экран }

mov si, offset s2 { строки символов s2 }

mov cl,1ah { видеоатрибут }

int 30h

mov ax,300h { Функция 3, подфункция 0: }

mov dl,excep { вывод на экран номера исключения }

mov cl,1ch { видеоатрибут }

int 30h

db 66h

iret

end;

end.

(*16. а) Исключение, вызванное запретом чтения из сегмента кода б) Разработать обработчик прерывания от системного таймера, который каждые 5 секунд меняет цвет бордюра.

I. Вызвать требуемое в индивидуальном задании исключение.

II. Обработать это исключение одним из двух способов:

а) устранив причину исключения;

б) пропустив команду, вызвавшую исключение.

III. Обработать заданное внешнее прерывание.*)

program p_intr;

{ Обработка прерываний в защищенном режиме }

uses crt, prot; { Модуль PROT содержит константы, }

{ типы переменных, переменные, процедуры и функции }

{ для работы в защищенном режиме }

label ret_r; { Точка возврата в реальный режим }

const

s:string='Обработка исключений и прерываний в защищенном режиме';

s1:string='CS SS DS ES CR0 EFLAGS: ';

s2:string='Обработано исключение ';

s3:string='Na 5 tik timera menyaem cvet BORDURA.';

s4:string='Press Esc to exit';

var

cs_real, { Значение регистра CS в реальном режиме }

err, { Код ошибки }

lim1,lim2,count:word;

scan,i,al_,ah_,n_exc,row:byte;

sscan:byte;

eflags:longint;

quel,counter,color:byte;

dwd:word;

{--------------Разработка обработчиков исключений--------------}

procedure out_exc;assembler; { Вывод номера исключения }

asm

mov ah,1 { Функция 1: установка маркера на экране }

mov bl,22 { с координатами - строка 22, }

mov bh,1 { столбец 1 }

int 30h

mov ah,4 { Функция 4: вывод на экран }

mov si, offset s2 { строки символов s2 }

mov cl,1eh

int 30h

mov ax,300h { Функция 3, подфункция 0: }

mov dl,excep { вывод на экран номера исключения }

mov cl,1ch

int 30h

mov dx,dwd

ret

end;

procedure exc_00;assembler; { Обработчик исключения 0 }

{-----Два варианта устранения зацикливания обработки отказа----}

mov bl,1 { Вариант 1: устранение причины отказа }

pusha

(* push bp { Вариант 2: изменение в стеке значения }

mov bp,sp { счетчика команд IP на величину длины команды }

inc word ptr [bp+2]

pop bp *)

mov excep,0

call out_exc; { Вывод сообщения об обработке исключения }

popa

cmp cpu_type,2

jz @2

db 66h

@2:iret

end;

procedure exc_13;assembler; { Обработчик исключения 0 }

{-----Два варианта устранения зацикливания обработки отказа----}

asm

cmp cpu_type,2

jz @1

db 66h

@1:pop bx

{-------------Вариант 2: изменяет в стеке значение------------}

{-------------счетчика команд IP на длину команды,------------}

{-----------вызвавшей исключение (div bl - 1 байт)------------}

push bp

mov bp,sp

add word ptr [bp+2],4 { или inc word ptr [bp+2] }

pop bp

{---------------------Вывод сообщения-------------------------}

{---------о возникновении исключения с номером excep----------}

pusha

mov excep,13

int 32h

(*push bx

mov ax,501h { Функция 5: вывод на экран }

mov cl,1eh { кода ошибки в двоичной форме }

pop dx

int 30h *)

popa

{-------Вариант 3: выполняет выход из защищенного режима-------}

{----через межсегментный косвенный переход на метку ret_mov----}

(* db 0ffh,2eh

dw ofs_ret_mov *)

cmp cpu_type,2

jz @2

db 66h

@2:iret

end;

procedure exc_0b;assembler; { Обработчик исключения 11 }

{ вызывается при отсутствии сегмента в памяти и выполняет }

{ коррекцию дескриптора сегмента - востанавливает бит P }

asm

mov excep,0bh

cmp cpu_type,2

jz @1

db 66h

@1:pop bx { Чтение из стека кода ошибки }

mov err,bx { и запись в переменную err }

and bx,not 7 { Выделение смещения селектора }

add bx,offset gdt+5 { Выбор поля байта доступа в GDT }

push ax

mov al, [bx] { Чтение байта доступа сегмента }

or al,80h

mov [bx],al { Установка бита P=1 в байте доступа }

pop ax

cmp cpu_type,2

jz @2

db 66h

@2:iret

end;

procedure keyb;assembler; { Обработчик прерываний }

asm { от клавиатуры: }

mov al,20h

out 20h,al { Сброс контроллера прерываний }

in al,60h { Чтение скан-кода нажатия/отжатия клавиши }

test al,80h

jnz @1 { Переход, если клавиша отжата }

mov scan,al

@1:cmp cpu_type,2

jz @3

db 66h

@3:iret

end;

procedure ttim;assembler; { Обработчик прерываний }

asm { от timer: }

push ax

mov al,$20

out $20,al { Сброс бита регистра ISR 1-го ПКП }

pop ax

inc counter

cmp counter,5

jnz @99

mov counter,0

push dx

push ax

mov dx,3dah

in al,dx

mov dx,3c0h

mov al,11h

out dx,al

inc color

mov al,color

out dx,al

mov al,20h

out dx,al

pop dx

pop ax

@99:cmp cpu_type,2 { Если 80286 - разрядность 16, }

jz @l1 { иначе - 32 }

db 66h

@l1:iret

end;

begin

clrscr;

{------Определение значения сегмента кода cs1 процедур,-----}

{------------------описанных в модуле PROT------------------}

cs1:=Seg(int_30h);

excep:=$ff; { Отличное от FFh значение переменной excep }

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

sscan:=0; { Клавиша не нажата }

res:=0; { МП сброшен не был }

{-----------Определение типа микропроцессора----------------}

get_cpu_type(0,cpu_type); { В cpu_type - номер типа МП }

if cpu_type=2 then t:=0 { 16-разрядный МП }

else t:=8; { 32-разрядный МП }

{ Формирование байта доступа прерывания: }

acc_int:=present OR type_int OR t;

{ Формирование байта доступа ловушки: }

acc_trap:=present OR type_trap OR t;

{-----------------Формирование таблицы GDT--------------------}

{ Нуль-дескриптор: }

init_gdt(0,0,0,0,0);

{ Дескриптор первого сегмента кода: }

init_gdt(1,$ffff,lin_adr(cseg,0),acc_code1,0);

{ Дескриптор второго сегмента кода: }

init_gdt(2,$ffff,lin_adr(cs1,0),acc_code,0);

{ Дескриптор сегмента данных: }

init_gdt(3,$ffff,lin_adr(dseg,0),acc_data,0);

{--------Имитация отсутствия сегмента данных в памяти:--------}

{-------------бит P в его дескрипторе равен нулю--------------}

{ gdt[3].acc:=gdt[3].acc and not present;

{ Дескриптор сегмента стека: }

init_gdt(4,0,lin_adr(sseg,0),acc_stack,0);

{ Дескриптор сегмента видеопамяти: }

init_gdt(5,4000-1,lin_adr($b800,0),acc_data,0);

{------Формирование данных регистра GDTR и его загрузка-----}

init_gdtr;

{----Определение селектора (cs_real) и смещения (ofs_ret)---}

{-------------точки возврата в реальный режим---------------}

cs_real:=Cseg;

asm mov ofs_ret,offset ret_r end;

{---------------------Формирование данных-------------------}

{---------для перехода на метку ret_r после сброса МП-------}

{-----------с инициализацией контроллера прерываний---------}

save_ret_real(cs_real,ofs_ret,5);

{------Запрет маскируемых и немаскируемых прерываний--------}

not_int;

{--------------Формирование таблицы IDT-------------------- }

{ Дескрипторы шлюзов обработчиков исключений 0-18: }

init_idt(0,ofs(exc_00),code_sel,acc_trap);

init_idt(1,ofs(exc_01),code_sel2,acc_trap);

init_idt(2,ofs(exc_02),code_sel2,acc_trap);

init_idt(3,ofs(exc_03),code_sel2,acc_trap);

init_idt(4,ofs(exc_04),code_sel2,acc_trap);

init_idt(5,ofs(exc_05),code_sel2,acc_trap);

init_idt(6,ofs(exc_06),code_sel2,acc_trap);

init_idt(7,ofs(exc_07),code_sel2,acc_trap);

init_idt(8,ofs(exc_08),code_sel2,acc_trap);

init_idt(10,ofs(exc_10),code_sel2,acc_trap);

init_idt(11,ofs(exc_0b),code_sel,acc_trap);

init_idt(12,ofs(exc_12),code_sel2,acc_trap);

init_idt(13,ofs(exc_13),code_sel,acc_trap);

init_idt(14,ofs(exc_14),code_sel2,acc_trap);

init_idt(16,ofs(exc_16),code_sel2,acc_trap);

init_idt(17,ofs(exc_17),code_sel2,acc_trap);

init_idt(18,ofs(exc_18),code_sel2,acc_trap);

{ Дескриптор шлюза обработчика прерывания от таймера: }

init_idt($20,ofs(ttim),code_sel,acc_int);

{ Дескриптор шлюза обработчика прерывания от клавиатуры : }

init_idt($21,ofs(keyb),code_sel,acc_int);

{ Дескрипторы шлюзов обработчиков прерываний IRQ2-IRQ7: }

for i:=2 to 7 do

init_idt($20+i,ofs(PIC_1),code_sel2,acc_int);

{ Дескрипторы шлюзов обработчиков прерываний IRQ8-IRQ15: }

for i:=8 to 15 do

init_idt($20+i,ofs(PIC_2),code_sel2,acc_int);

{ Дескриптор шлюза обработчика программного прерывания: }

init_idt($30,ofs(int_30h),code_sel2,acc_trap);

init_idt($32,ofs(int_32h),code_sel2,acc_int);

{-------Сохрание данных регистра IDTR в переменной IDTR-----}

asm

db 0fh,1,0eh { SIDT idtr }

dw idtr_r

end;

{------Формирование данных регистра IDTR и его загрузка-----}

{--------------для работы в защищенном режиме---------------}

init_idtr_p;

(* {--------------Формирование данных регистра IDTR------------}

{---------------для работы в реальном режиме---------------}

init_idtr_r; *)

{----------Программирование контроллера прерываний----------}

{--------------для работы в защищенном режиме---------------}

pic(1);

{-------Сохранение содержимого регистров DS,SS,ES и SP------}

save_sreg;

real_sp:=SPtr;

if cpu_type=2 then

{---------Переход в защищенный режим для МП 80286-----------}

asm { Установка бита PE=1 в регистре MSW: }

db 0fh,01h,0e0h { SMSW AX }

or ax,1

db 0fh,01h,0f0h { LMSW AX }

end else

{-------Переход в защищенный режим для МП 80386 и выше-----}

asm { Установка бита PE=1 в регистре управления CR0: }

db 0fh,20h,0c0h { MOV EAX,CR0 }

db 66h,0dh { OR EAX,1 }

dd 1h

db 0fh,22h,0c0h { MOV CR0,EAX }

end;

asm

push code_sel { Дальний переход на метку @prot }

push offset @prot { для загрузки CS и сериализации }

retf

{----------------Работа в защищенном режиме-----------------}

{---------------Загрузка сегментных регистров---------------}

{---------------соответствующими селекторами----------------}

@prot:

mov ds,data_sel { DS, }

mov ss,stack_sel { SS }

mov es,video_sel { и ES }

{-------------------Вывод на экран строки-------------------}

{---------"Обработка прерываний в защищенном режиме"--------}

{-----------с помощью функций 1 и 4 прерывания 30h----------}

mov ah,1 { Установка маркера: }

mov bx,903h { строка 3, столбец 9 }

int 30h

mov ah,4 { Вывод строки s на экран: }

mov cl,1eh { видеоатрибут, }

mov si,offset s { адрес строки }

int $30

mov ah,1

mov bx,705h

int 30h

mov ah,4 { Функция 4: вывод на экран }

mov si, offset s1 { строки символов s1 }

mov cl,1ch

int 30h

mov ax,301h { Функция 3, подфункция 1: }

mov dx,cs

mov cl,1ch

int 30h { Вывод на экран CS }

mov ax,301h

mov dx,ss

mov cl,1ch { Вывод на экран SS }

int 30h

mov ax,301h

mov dx,ds

mov cl,1ch

int 30h { Вывод на экран DS }

mov ax,301h

mov dx,es

mov cl,1ch

int 30h { Вывод на экран ES }

mov ax,302h { Функция 3, подфункция 2: }

db 0fh,20h,0c2h { MOV EDX,CR0 }

mov cl,1ch

int 30h { Вывод на экран CR0 }

mov ax,302h

db 66h

pushf

db 66h

pop dx

mov cl,1ch

int 30h { Вывод на экран EFLAGF }

mov ah,1

mov bx,510h

int 30h

mov ah,4 { Функция 4: вывод на экран }

mov si, offset s3 { строки символов s3 }

mov cl,1ch

int 30h

mov ah,1

mov bx,511h

int 30h

mov ah,4 { Функция 4: вывод на экран }

mov si, offset s4 { строки символов s3 }

mov cl,1ch

int 30h

{Virabotka zad isklucheniya}

mov ax,cs:[0]

{-------------Разрешение маскируемых прерываний-------------}

sti

{----Ожидание и обработка прерываний до установки семафора----}

{mov ax,cs:[0]}

@wait:

cmp scan,1h

jnz @wait

{int 13}

cmp cpu_type,2

jnz @mov

{----Возврат в реальный режим по сбросу микропроцессора-----}

push code_sel2

push offset reset

retf

{---Подготовка к возврату в реальный режим по команде MOV---}

{---------Установка параметров сегментов DS, SS и ES--------}

{---------------для работы в реальном режиме----------------}

@mov:

(* ARBEITEST an seleron 6 version !!!

push code_sel2

push offset reset

retf

*) cli

mov ds,data_sel

mov ss,data_sel

mov es,data_sel

{---------------Восстановление атрибутов IDT----------------}

{---------------для работы в реальном режиме----------------}

{-------Возврат в реальный режим по команде MOV-------------}

db 0fh,01h,1eh { LIDT idtr_r }

dw idtr_r

db 0fh,20h,0c0h { MOV EAX,CR0 }

db 66h,25h { AND EAX,FFFFFFFEh }

dd 0fffffffeh

db 0fh,22h,0c0h { MOV CR0,EAX }

push cs_real

push ofs_ret

retf

{-----------------Работа в реальном режиме------------------}

{---------------Восстановление регистров после--------------}

{------------------возврата в реальный режим----------------}

ret_r:

xor ax,ax

mov ds,ax

mov ds,[4*60h] { DS, }

mov ss,real_ss { SS, }

mov es,real_es { ES }

mov sp,real_sp { и SP }

end;

if res=0 then

{-------Перепрограммирование контроллеров прерываний--------}

{-------------для работы в реальном режиме------------------}

pic(0)

else

{---------Размаскирование контроллеров прерываний-----------}

{---------------после сброса микропроцессора----------------}

begin

port[$21]:=184;

port[$a1]:=13;

end;

{---Разрешение маскируемых и немаскируемых прерываний---}

en_int;

{-----В случае возникновения исключения вывод его номера-----}

gotoXY(1,20);

{----------Анализ возврата МП из защищенного режима---------}

if res=0 then s:='по команде MOV' else s:='через сброс МП';

writeln('Возврат из защищенного режима выполнен ',s);

writeln('Скан-код нажатой клавиши - ',scan,' - ESC');

end.

5. Результати роботи програми

Розроблена програма реалізує перехід у захищений режим і виводить на екран відомості про тип процесора і виводить вміст регістру флагів і іншу інформацію о системі. Потім реалізується цикл чекання переривання від клавіатури при натисканні клавіші ESC, під час цього обробляються переривання від таймеру і по кожному п’ятому тіку таймеру виконується змінення кольору бордюру. Після завершення циклу чекання натиску клавіші ESC програма реалізує виняткову ситуацію для виникнення 13 переривання, яке обробляється створеним перериванням, яке вилучає із стеку дескриптор помилки і обминає виняткову ситуацію. В кінці програма повертається у реальний режим і відновлює старі таблиці GDT та IDT.

6. Висновки

В даній розрахунково-графічній роботі розроблено програму, що реалізує захищений режим роботи мікропроцесора, обробку апаратних і програмних переривань, засвоєно основні принципи роботи мікропроцесора у захищеному режимі при використанні сегментної моделі пам’яті, порядок обробки переривань, структуру таблиць GDT та IDT.

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Нет! Мы не выполняем работы на заказ, однако Вы можете попросить что-то выложить в наших социальных сетях.
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
4144
Авторов
на СтудИзбе
666
Средний доход
с одного платного файла
Обучение Подробнее