Autor: TABOR (tabor_at_infoserv.ii.uj.edu.pl)
Data: Fri 11 Apr 1997 - 13:24:35 MET DST
Ponizsza funkcja assemblerowa rozpoznaje typ procesora. Znam na tyle
assembler, ze rozumiem poszczegolne operacje, ale sensu calosci
zupelnie nie "jarze" (tzn. zdaje sobie sprawe, ze operacje te maja zmusic
procesor do popelnienia jakiegos charakterystycznego bledu, czyli powiedzenia
"Jam jest", ale jest tu tego tak duzo, ze potrafie sie domyslic z jakich
"kruczkow" skorzystano).
Bylbym szczerze rad z pomocy, mogacej przyjac formy:
1. Wyjasnienia co sie dzieje w tej funkcji ("Co jest czym czego?").
2. Wskazania prostszej metody sprawdzania typu procesora (lub dowodu
ze takowa nie istnieje) i metody rozrozniania procesorow danego typu
(tzn. Intel panie, albo Janie, AMD na pokladzie; pomysly typu:
10 FUNCTION ProcModel
20 GET(Srubokret)
30 Cover.Remove() //Skad u licha ten obiekt?
40 REMOVE(Cooler)
50 RETURN type
nie wchodza w rachube
3. Wskazania miejsca, gdzie moglbym poczytac sobie o zakloceniach
w regule zgodnosci w dol w rodzinie 80x86 - w koncu przeciez
moge napisac taka funkcje sam.
4. Jakichs informacji o anomaliach w Pentiumie umozliwiajacych
jego wykrycie.
5. Pociechy moralnej.
Alisci, kiedy piorun pieprznal w bude,
lancuch jeszcze trzy dni szczekal
Przepraszam za brzydkie pismo...
wejscie: brak
wyjscie: AX = 0 jesli 8088/8086
AX = 1 jesli 80188/80186
AX = 2 jesli 80286
AX = 3 jesli 388 (DX lub SX)
AX = 4 jesli 486 (DX lub SX)
GetCPUType proc far
xor ax, ax
push ax
popf
pushf
pop ax
and ax, 0f000h
cmp ax, 0f000h
jnz getcpu_2 ; skocz jesli nie 8088,80188,8086,80186
push cx
mov ax, 0ffffh
mov cl, 21h ; 286+ mask -cl- with 1fh
shl ax, cl
pop cx
jnz getcpu_1 ; skocz jesli 80188 lub 80186
; Znalezlismy 8088 lub 8086
xor ax, ax
jmp getcpu_exit
; Znalezlismy 80188 lub 80186
getcpu_1:
mov ax, 0001
jmp getcpu_exit
; Mamy procesor 286+, Sprawdzic czy to jest 286
getcpu_2:
mov ax, 7000h
push ax
popf
pushf
pop ax
and ax, 7000h
jnz getcpu_3 ; Skocz jesli nie 80286
; Znalezlismy 80286
mov ax, 0002
jmp getcpu_exit
; Znalezlismy procesor 80386+, Sprawdzic czy to 80386
getcpu_3:
push dx
mov dx,0003
push eax
push ebx
push ecx
mov ebx,esp
and esp,-04
pushfd
pop eax
mov ecx,eax
xor eax,00040000h
push eax
popfd
pushfd
pop eax
and eax,00040000h
and ecx,00040000h
cmp eax,ecx
jz getcpu_4 ; Skocz jesli 80386
; Znalezlismy 80486
mov dx,0004
getcpu_4:
push ecx
popfd
mov esp,ebx
pop ecx
pop ebx
pop eax
mov ax,dx
pop dx
getcpu_exit:
retf
GetCPUType endp
Interesuja mnie rowniez informacje o kodach rozkazow:
xadd dx, dx
setb ah
smsw dx
To archiwum zostało wygenerowane przez hypermail 2.1.7 : Tue 18 May 2004 - 16:01:52 MET DST