Re: ASM - Typ procesora

Autor: Jarek Lis (lis_at_okapi.ict.pwr.wroc.pl)
Data: Fri 11 Apr 1997 - 17:47:45 MET DST


TABOR <tabor_at_infoserv.ii.uj.edu.pl> wrote:
: 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).

siegnij do www.intel.com. gdzies tam gleboko jest notka jak rozpoznawac
procesory.

: 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

Jak widzisz - probowalismy wyzerowac wszystkie bity flag, i sprawdzamy
czy sie nam udalo. Tam sa pewne charakterystyczne informacje na pewnych
bitach.

: 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

Jak widzisz w komentarzu. Juz nie pamietam ktore procesory,
ale pewne przy rozkazie przesuniecia uwzglednialy tylko najmlodszych 5 bitow
z zadanej liczby - kazem przesunac 16 bitowy rejestr o 33 bity,
i sprawdzamy czy przesunal o 33, czy tylko o 1 [33-32] bit.
 
: 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

kolejne sprawdzanie bitow flag, ktore w 286 sa zawsze 0.

: ; 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

i jak widzisz zabieramy sie za pozostale 16 z 32 bitow flag w 3/4/586.

J.



To archiwum zostało wygenerowane przez hypermail 2.1.7 : Tue 18 May 2004 - 16:01:54 MET DST