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 }