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 trotzdem 😕

    Das 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 😕


  • Mod

    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 🤡


  • Mod

    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.


Anmelden zum Antworten