Programm startet nicht auf AMD Prozessoren (aber auf Intel)

Nach etwas Recherche läuft hier glaube ich folgendes ab:
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.
 
  • Gefällt mir
Reaktionen: grabeskuehle und blöderidiot
@Nai Deine Recherche ergibt auch meinen Beobachtungen nach Sinn.
Ich weiß jetzt nicht was da die praktikabelste Lösung wäre, mein erster Gedanke wäre natürlich die Bedingung der Schleife abzuändern.
 
Zurück
Oben