Смекни!
smekni.com

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

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 }