Как сделать цикл в x86 ассемблере?

Я написал код насколько:

.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

Как я заставляю это повторять те же шаги три раза с помощью цикла, очищая экран после каждого повторения цикла?

16
задан Ciro Santilli 新疆改造中心法轮功六四事件 9 November 2015 в 13:33
поделиться

4 ответа

Используйте регистр CX для подсчета циклов

mov cx, 3
startloop:
   cmp cx, 0
   jz endofloop
   push cx
loopy:
   Call ClrScr
   pop cx
   dec cx
   jmp startloop
endofloop:
   ; Loop ended
   ; Do what ever you have to do here

Это просто повторяется 3 раза, вызывая ClrScr , помещая регистр CX в стек, сравнивая с 0, скачивая, если установлен ZeroFlag, затем переходите к endofloop . Обратите внимание, как содержимое CX вставляется / выталкивается в / из стека, чтобы поддерживать поток цикла.

2
ответ дан 30 November 2019 в 17:04
поделиться

Вам необходимо использовать условные команды jmp. Это не тот синтаксис, который вы используете; выглядит как MASM, но, используя GAS, вот пример кода, который я написал для вычисления gcd:

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 */

По сути, я сравниваю два регистра с инструкцией cmpl (сравните долго). Если оно меньше, инструкция JL (без перехода) переходит к месту предварительной замены, в противном случае выполняется возврат к той же метке.

Что касается очистки экрана, это зависит от используемой вами системы.

0
ответ дан 30 November 2019 в 17:04
поделиться

Еще один метод использует инструкцию LOOP:

mov  cx, 3

myloop:
    ; Your loop content

    loop myloop

Инструкция цикла автоматически уменьшает cx и перескакивает только в том случае, если cx! = 0. Существуют также варианты LOOPE и LOOPNE, если вы хотите выполнить дополнительную проверку, чтобы ваш цикл прервался раньше.

Если вы хотите изменить cx во время цикла, убедитесь, что вы поместили его в стек перед содержимым цикла и удалили его после:

mov  cx, 3

myloop:
    push cx
    ; Your loop content
    pop  cx

    loop myloop
12
ответ дан 30 November 2019 в 17:04
поделиться
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
ответ дан 30 November 2019 в 17:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: