Rep Call XXX
-
Hi
In meinem Tutorial steht das hier das Wort "Hallo" 3 mal ausgegeben wird.
Geschieht aber bei mir nur 1 mal!.model tiny .code org 100h START: mov cx, 3h ;wir setzen den Zähler auf 3 rep call write ;wiederhole den call zu write 3 mal.. ENDE: ;schönes Label oder ? mov ah,4ch ;4Ch zum Beenden INT 21h ;Beende ! Write: lea dx, MSG1 ;das gleiche wie mov dx, offset MSG1 mov ah, 9h int 21h ret MSG1 db 'Hallo ',10d,13d,'$' ;Ein String.. END START ;hier ist das ganze zuende..
aber wieso?
Danke schön
Cu
Niko
-
Na da wuerde ich mir aber ganz schnell mal ein anderes Tut suchen
Das kann so natuerlich nicht funktionieren, weil ret am Ende der Proc "Write" zum naechsten Befehl nach dem call springt. Mit diesem call verlaesst du also nach dem ersten mal schon diese rep-Schleife.
Um den String 3mal ausgeben zu lassen wuerde ich eher sowas empfehlen:
...
mov cx,0003h
@@Loop0:
call Write
loop @@Loop0
...Dabei musst du aber aufpassen, dass in der proc cx nicht ueberschrieben wird!
In der proc write ist das nicht der Fall, deshalb muss cx auch nicht gespeichert werden.
-
Wenn du in deiner Prozedur CX verwenden willst, speichere einfach CX mit PUSH und POP:
prozedur: push cx ;... ;... pop cx ret
@nobuo_t: du hast recht indem du sagst es klappt nicht wegen dem RET. Aber es klappt auch nicht wegen dem REP. REP/REPNZ klappt nur mit String Instruktionen. Die sind SCASB, CMPSB, LODSB, STOSB und MOVSB.
Nach folgendem Code wird ax = 1 sein:mov cx,6 xor ax,ax rep inc ax
Ach ja, das Tutorial von dem du sprichst ist echt mies. Ich hätte da was besseres von SnakeByte erwartet.
[ Dieser Beitrag wurde am 25.05.2002 um 17:59 Uhr von malfunction editiert. ]
-
Hey
Ihr seit echt spitze hier!Danke!
Cu
Niko
-
peinlich...
aber könnt ihr bitte SnakeBytes Beispiel mit "rep" so umbauen, das es funktioniert?!? (bin noch Anfänger )
gibt es eigentlich noch ein anderes deutsches Tutorial?
Danke schön
Cu
Niko
-
Aehm. schau mal oben in mein letztes Post. da stehts schon.
Musst einfach nur das mov cx,3h und rep call Write in dem Beispielcode durch die Paar Zeilen da ersetzen
-
Hi
Aber das ist doch dann eine Loop-Schleife und keine Repeate-Schleife. Oder?
Naja. is ja eigentlich egalDanke
Cu
Niko
-
Also eigentlich war der Code von Nobuo_T schon richtig. Ich weiß ich nicht 100%-ig was du mit einer repeate- und einer loop-Schleife meinst. Ich poste hier einfach mal einen Auszug aus meinem unfertigen ASM Tutorial. Ich hatte in letzter Zeit einfach keinen Bock weiter daran zu schreiben. Erwartet einfach, dass es irgendwann nächstes Jahr fertig sein wird.
Deutschsprachige Tutorials kenne ich sonst nicht. Wieso kein englisches? Bei dem ganzen Programmierkram braucht man sowieso nicht viel Englisch zu können. Hälfte ist sowieso Fachchinesisch.
Ok, hier nun der Auszug zum Thema Schleifen. Ihr könnt mir ruhig Kritik geben, ob es verständlich ist oder nicht.- Schleifenkonstruktionen:
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Wie in jeder anderen Programmiersprache gibt es in Assembler natürlich auch
Schleifen. Die einfachste Schleife können wir mit der LOOP Instruktion
erstellen (Oh mein Gott, schon wieder eine neue Instruktion *g*).
'LOOP label' verkleinert CX um einen und wenn CX dann nicht null ist
wird zum angegeben Label gesprungen. Hier eine Beispielschleife:mov cx,6 schleife: ; ... ; ... hier steht dann der code ; ... loop schleife
Sieht einfach aus? Ist es auch. Diese Schleife würde sechs mal durchlaufen.
Die LOOP Instruktion ist zwar schön einfach, hat aber einen Nachteil:
Das anzuspringende Label darf nur maximal -127 bytes oder +128 bytes
entfernt sein. Alternativ können wir auch einen bedingten Sprung für eine
Schleife nutzen. Das sähe dann ungefähr so aus:mov cx,6 schleife: ; ... ; ... hier steht der code ; ... dec cx jne schleife
Ihr werdet euch vielleicht wundern: "Warum ist dort ein conditional jump ganz
ohne CMP?". Nun, die meisten Intruktionen wirken sich wie CMP auf die Flags
aus. Ergibt eine arithmetische Instruktion wie DEC den Wert Null wird immer
das Zero Flag gesetzt. JNE ist ja das gleiche wie JNZ, springt also wenn das
Zero Flag ungleich Null ist.
Beide Schleifen sind gleich und laufen sechs mal durch. Beide laufen auch immer
mindestens einmal durch, da die Abfrage am Ende ist. Nun schauen wir uns mal
eine Schleife an, die am Anfang testet (in anderen Programmierschleifen
meist WHILE Schleife genannt):mov cx,6 schleife: cmp cx,0 je ende_schleife ; ... ; ... code ; ... dec cx jmp schleife ende_schleife:
Ich weiß, dass sieht wenig sinnvoll aus, weil er wieder die Schleife genau
sechs mal durchlaufen lässt. Sinn bekommt es aber, wenn in diesem Beispiel
der Wert für cx nicht festgelegt wäre, sondern variabel sei. Zum Beispiel
um irgendwas mit einem String zu machen und wenn der String die Länge Null
hat wird die Schleife erst gar nicht durchlaufen. Der Unterschied zu den
vorherigen Schleifen sollte klar sein: Diese Schleife kann im Gegensatz zu
den vorherigen auch gar nicht durchlaufen.
- Schleifenkonstruktionen:
-
Nicht schlecht.
Freue mich schon wenn es fertig ist!Danke schön
Niko