Prozessor-String auslesen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Ahh, sehr schön :allright: ! Habe ich gerade erst gesehen. In der Mittagspause habe ich eben folgendes geschrieben:

Code: Alles auswählen

;- Prozessor-String mittels CPUID direkt auslesen
;- erstellt einen UNICODE-String! (Oder, was ich dafür halte)
;- Also dementsprechende Einstellung vornehmen! 
;- "Helle" Klaus Helbing, 25.06.2007, PB v4.02

Procedure Get_Prozessor_String_W(StringAdresse)
    !mov eax,80000000h       ;Test, ob CPU aktuell genug ist um den String zu liefern
    !cpuid
    !cmp eax,80000004h
    !jae @f                  ;alles o.K.
    !xor eax,eax             ;Rückgabewert = Null für eventuelle Auswertung Fehlschlag 
  ProcedureReturn
!@@:
    !mov esi,[p.v_StringAdresse]
    !xor edi,edi
    !pxor xmm7,xmm7
!@@:    
    !mov eax,80000002h
    !add eax,edi
    !cpuid        
    !movd xmm0,eax
    !punpcklbw xmm0,xmm7     ;wenn die CPU obigen Test bestanden hat, sollte auch dies funktionieren (SSE2)
    !movq [esi],xmm0    
    !movd xmm0,ebx
    !punpcklbw xmm0,xmm7
    !movq [esi+8],xmm0         
    !movd xmm0,ecx
    !punpcklbw xmm0,xmm7
    !movq [esi+16],xmm0    
    !movd xmm0,edx
    !punpcklbw xmm0,xmm7
    !movq [esi+24],xmm0            
   
    !inc edi
    !cmp edi,3
    !je @f
    !add esi,32
    !jmp @b
!@@:
    !mov byte[esi+32],0      ;Zero-Byte; mal ganz vorbildlich, obwohl hier im speziellen Fall nicht nötig
    !mov eax,1               ;Rückgabewert <> Null für Erfolg
  ProcedureReturn   
EndProcedure 

ProzessorString$ = Space(49) ;der String kann max.48 Zeichen lang sein plus ein Zero-Byte zum Abschluss
                             ;ich hoffe, das ist hier so richtig mit der Anzahl
Get_Prozessor_String_W(@ProzessorString$)
MessageRequester("Prozessor-String mittels CPUID auslesen - Unicode-Variante", ProzessorString$)
Ist nicht 30, sondern "nur" 25-mal schneller.
Unicode ist an mir bisher spurlos vorbeigegangen; wenn´s falsch ist, bitte sagen!

Gruss
Helle
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> wenn´s falsch ist, bitte sagen!
Krieg nur IMA :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

bei mir klappt alles
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Fehlende SSE2-Unterstützung würde keinen IMA erzeugen, also kommt nur Space in Frage (verdoppeln!). Da war (bin) ich mir eben nicht sicher, ab Space im Unicode-Modus pro Zeichen 2 Bytes reserviert oder nicht. Ich kann Space bei mir auch auf 1 setzen und es funktioniert immer noch, aber das hängt natürlich von der momentanen Speicherverwaltung des Betriebssystems ab.

Gruss
Helle
Benutzeravatar
ChristianK
Beiträge: 77
Registriert: 13.12.2004 14:55

Beitrag von ChristianK »

>Krieg nur IMA Mr. Green

dein zweiter von zwei 32MB-Riegel hat ein Speicherfehler =)
ChristianK for President
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Hab keine 2 Riegel
Debugger hat geschrieben:Line : 47 - Illegal instruction, (executing binary data?)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag von legion »

Super ! Ein tolles Assembler Beispiel !
Auf so etwas hab ich schon lange gewartet.
Nur das mit den Sprungmarken ist mir nicht klar !
Was bedeutet "jae @f" oder "jmp @b" ?
Die Ziele schauen ja alle gleich aus! "!@@:"
Vielleicht kann mir das wer erklären.
Danke !

Ach ja, noch ne Frage !
Warum immer der Hinweis PB-Code sollte Unicode tauglich sein ?
Wer und für was braucht man das ?
Ist mir bis jetzt noch nie abgegangen !

Danke für die Info !

Lg. Legion
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

"@@:" sind anonyme Labels. "Sprung @f" springt zum nächsten gefundenen anonymen Label vorwärts (f=forward) und "Sprung @b" zum nächsten Label rückwärts (b=backward). Anstelle von "@b" versteht FAsm auch "@r" (r=return). Macht Sinn in universell einsetzbaren Code-Teilen, um Kollisionen mit Label-Namen des restlichen Codes zu vermeiden.
Eine vernünftige Erklärung für Unicode in Beispielen hier im Forum müssen andere geben :mrgreen: !

Gruss
Helle
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag von legion »

Danke für die Erklärung !
Hatte schon die Vermutung, dass @f für forward und @b für backward
steht. Wollte mir das im Code anschauen, aber der Debugger überspringt leider die Assembler Zeilen.

Herzlichen Dank ! :allright:

Lg. Legion
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Antworten