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 egal 😉

    Danke
    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.

    1. 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.



  • Nicht schlecht.
    Freue mich schon wenn es fertig ist! 🙂

    Danke schön
    Niko


Anmelden zum Antworten