ASM - Typ procesora

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