Seite 1 von 2

Verfasst: 25.06.2007 13:18
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

Verfasst: 25.06.2007 14:34
von ts-soft
>> wenn´s falsch ist, bitte sagen!
Krieg nur IMA :mrgreen:

Verfasst: 25.06.2007 14:42
von Leonhard
bei mir klappt alles

Verfasst: 25.06.2007 15:03
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

Verfasst: 25.06.2007 15:20
von ChristianK
>Krieg nur IMA Mr. Green

dein zweiter von zwei 32MB-Riegel hat ein Speicherfehler =)

Verfasst: 25.06.2007 16:09
von ts-soft
Hab keine 2 Riegel
Debugger hat geschrieben:Line : 47 - Illegal instruction, (executing binary data?)

Verfasst: 29.06.2007 20:08
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

Verfasst: 29.06.2007 23:23
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

Verfasst: 30.06.2007 08:48
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