Nai
Lt. Commander
- Registriert
- Aug. 2012
- Beiträge
- 1.579
Nach etwas Recherche läuft hier glaube ich folgendes ab:
texturemaker.00760E73:
Eintrittspunkt für Schleife mit dem Header for(;ss:[ebp-1]!=0; ss:[ebp-1]--), d.h. Schleife läuft je nachdem wie ;ss:[ebp-1] soeben gesetzt wurde unendlich mal, 1 mal, oder 2 mal durch. Für jeden Durchlauf speichert ruft sie CPU-ID auf, und speichert die Cache-Informationen aus den Registern eax, ebx und ecx in ein Array im Datensegment ab.
Problem: Die CPU-ID-Instruktion für Cache-Informationen (eax = 2) ist, was ich gelesen habe, nicht standardisiert. D.h. wenn sie die untersten 2 Bits in eax auf 0 setzt, dann ist auch die Iterationsvariable bereits für den ersten Durchlauf 0, d.h. die Schleife terminiert niemals, und irgendwann gibt es einen Segmentation Fault, da das Array für das Zurückschreiben der Daten von den CPUID aufrufen überläuft.
Code:
texturemaker.00760E62:
mov eax, 2 // eax = 2
cpuid // cpuid mit eax = 2 als Argument speichert Cache und TLB-informationen in eax, ebx, und ecx ab
and al, 3 // setzt alle außer die untersten 2 bits in eax auf 0, d.h.
// diese Instruktion soll wahrscheinlich bestimmen, wie oft CPU-id gemäß seiner
//Rückgabe aufgerufen werden soll bis sämtliche alle Cache-Informationen
//abgefragt worden sind
mov byte ptr ss:[ebp-1], al // speichert das unterste byte von eax auf dem Stack ab,
// d.h. wegen vorherigem Befehl 0,1,2,oder 3
xor al, al // setzt das unterste byte von eax auf 0, wahrscheinlich
//damit das nächste mal CPUid das richtige zurückliefert.
texturemaker.00760E73:
Eintrittspunkt für Schleife mit dem Header for(;ss:[ebp-1]!=0; ss:[ebp-1]--), d.h. Schleife läuft je nachdem wie ;ss:[ebp-1] soeben gesetzt wurde unendlich mal, 1 mal, oder 2 mal durch. Für jeden Durchlauf speichert ruft sie CPU-ID auf, und speichert die Cache-Informationen aus den Registern eax, ebx und ecx in ein Array im Datensegment ab.
Problem: Die CPU-ID-Instruktion für Cache-Informationen (eax = 2) ist, was ich gelesen habe, nicht standardisiert. D.h. wenn sie die untersten 2 Bits in eax auf 0 setzt, dann ist auch die Iterationsvariable bereits für den ersten Durchlauf 0, d.h. die Schleife terminiert niemals, und irgendwann gibt es einen Segmentation Fault, da das Array für das Zurückschreiben der Daten von den CPUID aufrufen überläuft.