Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Cheebi am 10. October 2006, 19:14
-
Hallo,
ich suche nach einem Codeabschnitt, der mir sagen kann, ob ein 386 oder höher Herr im Hause ist. In der Lowlevel-Ausgabe1 fand ich folgenden Codeabschnitt:
Ich habe eine Zeile markiert, in der ein Befeh meiner Meinung nach unnötig ist. Außerdem prüft mir dieser Codeabschnitt auf 286+ und nicht, wie angegeben, 386+.
; determine CPU type. Code from Freedows 98 ldr_asm.asm
; Copyright (C) 1997 Joachim Breitsprecher
cpu_check:
cli
pushf
pushf
pop ax
mov bx,ax
and ax,0x0FFF
or bx,0x7000
push ax
popf
pushf
pop ax
push bx
popf
pushf
pop bx
popf
and ax,0xF000 ; diese Zeile ist nicht nötig, um cmp ax, 0xf000 auszuführen und um zum gleichen Ergebnis zu kommen, oder?
cmp ax,0xF000
je not_386
test bx,0x7000
jne is_386plus
not_386:
Bitte um Hilfe,
Cheebi
-
Ich hab das Tutorial nicht gelesen, aber dem Code nach wird überprüft ob die Bits 24-31 gesetzt sind (was auch immer das sein mag).
Wenn alle gesetzt sind, ist es kein 386er (also jmp not_386), falls eines davon nicht gesetzt ist, handelt es sich um einen 386er.
Die 0xF000-Mask wird benutzt, weil die anderen Bits wohl nicht für die Prozessorbestimmung von Bedeutung sind.
-
Für mein System hatte ich mir mal eine kleine Funktion geschrieben:
;CPU detect <80286, 80286, 80386+
;OUT: ax = 0..2 ;destroy all other regs! (no register save)
;0=older then 286 O.o
;1=286 -_-
;2=+386 ^.^
init1.cpu.dedect:
;test 286
pushf
pop bx
and bx, 0x0FFF
push bx
popf
pushf
pop bx
and bx, 0x0F000
cmp bx, 0x0F000
jne .its286orbetter
xor ax, ax ;older then a 286
ret
.its286orbetter:
;test 386 (Set bit18, read bit18, bit18=0 then <386)
pushfd
pop eax
or eax, 0x40000 ;bit 18
push eax
popfd
pushfd
pop eax
and eax, 0x40000
cmp eax, 0x40000
je .its386orbetter
mov ax, 1
ret
.its386orbetter:
mov ax, 2
ret
Das ganze natürlich im Realmode ausführen! ^^