到目前为止,我编写了代码:
.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
如何使用循环重复相同的步骤三次,在每次循环迭代后清除屏幕?
答案 0 :(得分:19)
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
答案 1 :(得分:11)
另一种方法是使用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
答案 2 :(得分:2)
使用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的内容以保持循环的流动。
答案 3 :(得分:1)
.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;
这个鳕鱼需要30个字符
答案 4 :(得分:0)
您需要使用条件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(跳转较少)指令跳转到预交换位置,否则它会跳回到相同的标签。
关于清除屏幕,这取决于您正在使用的系统。
答案 5 :(得分:0)
我正在寻找同样的答案&amp;发现此信息来自wiki有用: 循环说明
循环指令递减ECX并跳转到arg指定的地址,除非递减ECX导致其值变为零。例如:
mov ecx, 5
start_loop:
; the code here would be executed 5 times
loop start_loop
循环没有设置任何标志。
loopx arg
如果满足条件(即设置了特定标志),这些循环指令会递减ECX并跳转到arg指定的地址,除非递减ECX导致其值变为零。
loope 循环,如果相等
loopne 循环如果不相等
loopnz 循环,如果不是零
loopz 循环,如果为零