Syteminformationen



  • Hallo,
    ich habe mal ein paar Fragen:
    Wie kann ich die Systeminformationen (CPU, GPU, ...) auslesen?

    Danke schonmal im Vorraus.
    Mfg



  • Informationen über die CPU gibt dir die Instruktuin cpuid: http://www.lowlevel.eu/wiki/CPUID



  • Danke für die schnelle Antwort.
    Aber wie gebe ich die Register eax, ebx, ecx, edx aus?
    Wenn ich

    mov si,eax
    call print_string
    

    mache und mit nasm assembliere, kommt Invalid combination of opcode and operands.



  • Ist ja klar, du kannst schlecht ein 32-Bit-Register (EAX) in ein 16-Bit-Register schieben. Außerdem ist der Vendor-String nicht nullterminiert, d.h. mir normalen Ausgabe-Routinen wirst du ihn kaum ausgeben können.

    So ungefähr müsste es gehen (NASM):

    vendor db '            ', 0      ;12 Zeichen für Vendor-String und \0 um ausgeben zu können
    
    print_vendor:
        ;pushad ;Register sichern
    
        xor eax, eax ;eax auf 0 setzen
        cpuid
    
        mov dword [vendor], ebx
        mov dword [vendor+4], edx
        mov dword [vendor+8], ecx
    
        mov si, vendor
        call print_string
    
        ;popad ;Register widerherstellen
    
        ret
    

    Falls in den E*X-Registern was wichtiges steht, was während des Funktions-Aufrufes nicht verloren gehen darf einfach das pushad und popad wieder einkommentieren.



  • Danke jetzt funktionierts.

    Also ich wollte den CPU-Namen ausgeben lassen:

    mov eax, 0x8000_0002 
    cpuid
    

    Ist es normal, dass er mir dann InteInteInteInte)2 D)2 D)2 D)2 D8400840084008400 ausgibt? Soll das der CPU-Name sein?



  • Öhm, nein, das ist nicht normal. ~~Du machst es irgendwo beim speichern des Namens aus den Registern in den Buffer falsch. Zeig mal deinen Code.~~EDIT: Quatsch, mein Fehler, du versuchst anscheinend eher E*X jeweils 4x hintereinander in den String zu schreiben, das geht natürlich nicht.
    Der Name setzt sich in 0x8000_0003 und 0x8000_0004 fort. Du musst es so machen:

    1. 0x8000_0002 aufrufen.
    2. EAX, EBX, ECX, und EDX in nacheinander in den Buffer kopieren.
    3. 0x8000_0003 aufrufen.
    4. siehe 2.
    5. 0x8000_0004 aufrufen.
    6. siehe 2.
    7. ggf. noch Nullterminieren (bin mir grad nicht sicher ob der String schon fertig terminiert ist


  • BTW: Der Name setzt sich in 0x80000_0003 und 0x8000_0004 fort.

    Ja, dass der Name bei 0x80000_0003 und 0x8000_0004 weitergeht, weiß ich.
    Ich hab den fehler entdeckt:

    mov dword [vendor],eax
    mov dword [vendor+4],eax
    mov dword [vendor+8],eax
    mov dword [vendor+12],eax
    

    statt

    mov dword [vendor],eax
    mov dword [vendor+4],ebx
    mov dword [vendor+8],ecx
    mov dword [vendor+12],edx
    


  • Weis noch jemand, wie man Systeminformationen mit Assembler anzeigen kann?


Anmelden zum Antworten