Bug im Assembler Code mit Sparc Prozessor
-
Hallo Zusammen
Folgender Assembler Code generiert anhand eines Index bis zu 7-stellige Buchstabenfolgen. Wenn ich zum Beispiel 60 solcher Folgen generiere und diese Methode dann erneut von einer anderen Klasse generiere mit demselben Startindex, generiert mir das Programm ab der 10. Stelle ein anderes Passwort, obwohl es vom gleichen Index ausgeht. Das Besste kommt aber noch, wenn ich einen cout-Stream vor dem Assembler-Code mache, funktioniert es
.
Anbei der Assembler Code:for (; i >= 0; i--)^M {^M unsigned int nPlainCharsetLen = m_nPlainCharsetLen;^M unsigned int nTemp = 0;^M unsigned int nIndexOf32Temp = 0; unsigned int nMulTemp = 0; cout << "gugus"; __asm__ __volatile__ ( "udiv %1, %2, %0;" :"=r"(nIndexOf32Temp) :"r"(nIndexOfX32), "r"(nPlainCharsetLen) ); __asm__ __volatile__ ( "umul %3, %2, %4;" "sub %1, %4, %0;" :"=r"(nTemp) :"r"(nIndexOfX32), "r"(nPlainCharsetLen), "r"(nIndexOf32Temp), "r"(nMulTemp) ); nIndexOfX32 = nIndexOf32Temp; m_Plain[i] = m_PlainCharset[nTemp];^M
Kann es sein, dass ich die falschen Register benutze?
Für Eure Hilfe wäre ich sehr dankbar.Schönen Abend noch
Whisperer
-
Wozu ist nMulTemp im unteren asm Block eine Eingangsvariable? Das wird ja gar nicht verwendet. Du musst wahrscheinlich eine early clobber-Variable draus machen, sonst überschreibst du dir die Eingaberegister.
Also ca. so:
__asm__ __volatile__ ( "umul %4, %3, %1;" "sub %2, %1, %0;" :"=r"(nTemp), "=&r"(nMulTemp) :"r"(nIndexOfX32), "r"(nPlainCharsetLen), "r"(nIndexOf32Temp) );
(Kann's nicht ausprobieren, da ich keine SPARC-Maschine zur Verfügung habe)
-
nMulTemp ist ein unsigned int, der mit dem Wert 0 initialisiert wird. Da Sparc-Assembler nicht über eine Modulofunktion verfügt, berechne ich so den Rest der Division und speichere in nMulTemp das Resultat der Multiplikation.
Werde mal Deinen Input heute Abend testen.Grüsse Whisperer
-
Leider hat es nicht geklappt, trotzdem danke für Deine Bemühungen.
Grüsse Whisp