Autor Thema: CPU-Type Codeabschnitt  (Gelesen 5225 mal)

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« 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
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

AndiDog

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 10. October 2006, 19:35 »
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.
« Letzte Änderung: 10. October 2006, 19:37 von AndiDog »

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 10. October 2006, 19:52 »
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! ^^
db 0x55AA

 

Einloggen