Loop
-
Hi,
hab mal ne Frage, nämlich wie man einen Loop baut, bei
mir funktioniert das irgendwie nicht so wie ich mir das vorstelle...DATA SECTION KEEP DD 0 NUMBER DB 10 CODE SECTION START: MOV CX,[NUMBER] LOOP: PUSH -11 ;STD_OUTPUT_HANDLE CALL GetStdHandle ;get, in eax, handle to active screen buffer PUSH 0,ADDR KEEP ;KEEP receives output from API PUSH 4,'Huhu' ;4=length of string PUSH EAX ;handle to active screen buffer CALL WriteFile XOR EAX,EAX ;return eax=0 as preferred by Windows LOOP LOOP
Da wird die ganze Konsole mit aneinandergereihten "Huhu"'s
voll geschrieben obwohl ich eigentlich nur 10 (Number) wollte...
Doch warum
Liegt es vllt. am Register CX ?MfG Jonas
-
Ich habe den Code bei mir nicht ausprobiert und stelle jetzt mal Vermutungen auf:
- Irgendeine der C-Funktionen, GetStdHandle oder WriteFile, verändern ECX Register. So was dürfen Funktionen bei bestimmten Registern machen, hier ist eine schöne Quelle http://www.agner.org/optimize/ , wo man es nachlesen könnte, weiß nicht mehr in welchem Dokument (aber alle sind sehr informativ und nützlich)
- Vielleicht hast Du mal mit dem Code rumgespielt und vergessen, neu zu kompilieren... Passiert ab und zu mal...Ansonsten könnte man im Debugger genau sehen, was passiert. Richtige Tools haben einen Debugger dabei
-
Das sieht mir mehr nach WinAPI- als C-Funktionen aus. Die gehen aber auch nicht vorsichtiger mit den Registern um.
Zum Anderen wird das damit wahrscheinlich 32Bit-Code sein. Dann zaehlt loop ecx (wird hier nicht gesetzt->undefiniert!) runter und nicht nur cx.
Ein 32Bit- oder 16Bit-Register so wie du das da gemacht hast arglos mit einer Byte-Variable zu fuellen ist uebrigens keine so gute Idee. Was in diesem Fall hinter den 8Bit des Bytes bei "Number" kommt ist schliesslich bestenfalls undefiniert.
... Dass dein Code auch sonst recht unschoen ist, weisst du wahrscheinlich selbst.