CMP und JNE ... funktionieren nicht :-(
-
Ich wollte zur Übung nen ganz kleines Assembler Programm schreiben, unter
Verwendung von C++ und Inline Assembler.
Das ganze soll ein Array mit 5Zahlen ausgeben, jedoch bricht die ASM-Schleife nicht ab.Bin mit dem Debugger durchgegangen und die Werte in den Registern stimmen, aber
JNE dürfte, wenn eax = 4 und ecx = 4 ja nicht springen, tut es aber trotzdemDas Progrämmchen
int main () { int b[5] = {1, 2, 3, 4, 5}; // Array mit Werten int c; // Speichert das aktuelle Zeichen int size1 = 4; // Größe des Arrays int int_size = sizeof (int);// Größe eines Array-Elements __asm { xor ecx, ecx // ECX = 0 loop1: // Schleife mov eax, int_size // int_size nach eax mul ecx // eax mit ecx Multiplizieren (Offset für b) mov ebx, eax // den Wert in ebx speichern lea eax, b // Adresse von b nach eax add eax, ebx // Offset (in ebx) aufaddieren mov eax, [eax] // Den Wert an der Stelle nach eax lea ebx, c // Adresse von c nach ebx mov [c], eax // Den Wert in eax nach c kopieren push ecx // ecx sichern } cout << c << endl; // c ausgeben __asm { pop ecx // ecx wiederherstellen mov eax, size1 // Arraygröße nach eax cmp eax, ecx // eax und ecx vergleichen inc ecx // so lange ecx != size1 jnz loop1 // weitermachen } }
Nach meiner Befehlsreferenz setzt CMP das ZF, wenn die Werte gleich sind und JNE
wertet das ZF aus und springt, wenn ZF=0, also müsste die Schleife doch abbrechen
-
inc ecx beeinflusst das zero-flag auch...
es müsste also so aussehen:inc ecx // so lange ecx <= size1 cmp ecx, size1 jbe loop1 // weitermachen
-
Danke, habe ich nicht gewusst und dieses Konstrukt von dir arbeitet ja wie ne do-while-Schleife, sollte es jedenfalls...
...ich hab mein Programm jetzt geändert, aber wenn in ecx die 4 steht, dann greift jne nicht sondern macht einfach weiter als wäre nichts.
so sieht der zweite Block jetzt aus
__asm { pop ecx // ecx wiederherstellen inc ecx // ecx um 1 erhöhen cmp eax, size1 // eax und ecx vergleichen jne loop1 // weitermachen }
Habe eben mal noch je getestet und da wird nur die 1 ausgegeben und anschließend richtig abgebrochen
Edit:
Eben nachdem Abendessen wieder hingesetzt und ich seh den Fehler sofort, da
steht ja cmp eax, size1 und nicht cmp ecx, size1
-
mit jnz gibt er aber nur die ersten 4 werte aus, es sei denn, du erhöhst size1
-
Stimmt ist mir noch gar nicht aufgefallen.