wake-up-neo.com

Wie mache ich eine Schleife in der x86-Assembler-Sprache?

Ich habe den Code soweit geschrieben:

.code

main
 Clrscr

  mov dh,10            ;row 10

  mov dl,20            ;column 20

  call Gotoxy          ;locate cursor

  PromptForIntegers  

    WriteString       ;display string
    ReadInt           ;input integer
  ArraySum

    WriteString       ;display string
    WriteInt          ;display integer

DisplaySum  ENDP

END main

Wie kann ich die gleichen Schritte dreimal mit einer Schleife wiederholen und den Bildschirm nach jeder Schleifenwiederholung löschen?

15
user267288
mov cx,3

loopstart:
   do stuff
   dec cx          ;Note:  decrementing cx and jumping on result is
   jnz loopstart   ;much faster on Intel (and possibly AMD as I haven't
                   ;tested in maybe 12 years) rather than using loop loopstart
19

Eine weitere Methode verwendet den Befehl LOOP:

mov  cx, 3

myloop:
    ; Your loop content

    loop myloop

Die Schleifenanweisung dekrementiert automatisch cx und springt nur dann, wenn cx! = 0. Es gibt auch LOOPE- und LOOPNE-Varianten, wenn Sie zusätzliche Überprüfungen durchführen möchten, damit die Schleife früh ausbricht.

Wenn Sie cx während Ihrer Schleife ändern möchten, stellen Sie sicher, dass Sie die Datei vor dem Inhalt der Schleife in den Stack verschieben und anschließend abbrechen:

mov  cx, 3

myloop:
    Push cx
    ; Your loop content
    pop  cx

    loop myloop
11
Jeff B

Verwenden Sie das CX-Register, um die Schleifen zu zählen

 mov cx, 3 
 startloop: 
 cmp cx, 0 
 jz endofloop 
 Drücken Sie cx 
 Loopy: 
 Rufen Sie ClrScr .__ auf. pop cx 
 dec cx 
 jmp startloop 
 endofloop: 
 ; Schleife beendet 
 ; Tun Sie, was immer Sie hier tun müssen 

Dies geschieht einfach dreimal um den Aufruf von ClrScr, das CX-Register wird auf den Stack gelegt, mit 0 verglichen, springt, wenn ZeroFlag gesetzt ist, und springt zu endofloop. Beachten Sie, wie der Inhalt von CX auf den Stack gedrückt wird, um den Fluss der Schleife aufrechtzuerhalten.

2
t0mm13b
.model small
.stack 100h
.code 
Main proc
Mov cx , 30 ; //that number control the loop 30 means the loop will 
;excite 30 time 
Ioopfront:
Mov ah , 1
Int 21h 
Loop loopfront; 

dieser Kabeljau dauert 30 Zeichen 

1
rafeef

Ich war auf der Suche nach der gleichen Antwort und fand diese Informationen aus dem Wiki hilfreich: Loop Anweisungen

Der Schleifenbefehl dekrementiert ECX und springt zu der durch arg angegebenen Adresse, es sei denn, das Dekrementieren von ECX hat dazu geführt, dass sein Wert Null wurde. Zum Beispiel:

 mov ecx, 5
 start_loop:
 ; the code here would be executed 5 times
 loop start_loop

schleife setzt keine Flags.

loopx arg

Diese Schleifenanweisungen dekrementieren ECX und springen zu der durch arg angegebenen Adresse, wenn ihre Bedingung erfüllt ist (d. H. Ein spezifisches Flag ist gesetzt), es sei denn, das Dekrementieren von ECX hat dazu geführt, dass der Wert Null wurde.

  • Loope Schleife, wenn sie gleich ist

  • Schleife Schleife, falls sie nicht gleich ist

  • loopnz Schleife, falls nicht Null

  • loopz Schleife, falls Null

Quelle: X86-Baugruppe, Steuerfluss

0
Pranav Singh

Sie müssen bedingte jmp-Befehle verwenden. Dies ist nicht die gleiche Syntax, die Sie verwenden. sieht aus wie MASM, aber mit GAS ist hier ein Beispiel aus einem Code, den ich geschrieben habe, um gcd zu berechnen:

gcd_alg:
    subl    %ecx, %eax      /* a = a - c */
    cmpl    $0, %eax        /* if a == 0 */
    je      gcd_done        /* jump to end */
    cmpl    %ecx, %eax      /* if a < c */
    jl      gcd_preswap     /* swap and start over */
    jmp     gcd_alg         /* keep subtracting */

Grundsätzlich vergleiche ich zwei Register mit der cmpl-Anweisung (vergleiche long). Wenn es weniger ist, springt der JL-Befehl (Jump less) an die Preswap-Position, andernfalls springt er zu demselben Label zurück.

Das Löschen des Bildschirms hängt vom verwendeten System ab.

0
user257111