Я написал код насколько:
.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
Как я заставляю это повторять те же шаги три раза с помощью цикла, очищая экран после каждого повторения цикла?
Используйте регистр 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 вставляется / выталкивается в / из стека, чтобы поддерживать поток цикла.
Вам необходимо использовать условные команды 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 (без перехода) переходит к месту предварительной замены, в противном случае выполняется возврат к той же метке.
Что касается очистки экрана, это зависит от используемой вами системы.
Еще один метод использует инструкцию 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
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