这是我需要修复此无限循环的多个循环的代码。任何人都可以解决它吗?
.data
a dword 10
b dword 1
d dword 35
delta dword ?
.code
main PROC
call clrscr
mov dh,0
mov ecx,10
push ecx
row:
mov dl,01
mov ecx, a
mov eax,'*'
line:
call gotoxy
call writechar
inc dl
loop line
mov ecx, b
mov eax,'p'
line1:
call gotoxy
call writechar
inc dl
loop line1
mov ecx, d
mov eax,'c'
line2:
call gotoxy
call writechar
inc dl
loop line2
inc dh
mov dl,1
dec a
inc b
inc b
dec d
dec d
dec d
pop ecx
loop row
帮助无限循环。
答案 0 :(得分:0)
不要使用loop
指令进行嵌套循环!
我不知道为什么,但最近在SO上,有许多初学者试图通过使用loop
指令(和MASM)来制作几个嵌套循环。这些可能是一些愚蠢的老师介意如何在汇编中制作嵌套循环。
所以,停止这个!这完全是一种不好的做法。忘记loop
指令并为循环计数器使用单独的寄存器。它非常简单明了:
mov edx, 1000
loop1:
mov ecx, 2000
loop2:
mov ebx, 3000
loop3:
......
dec ebx
jnz loop3
dec ecx
jnz loop2
dec edx
jnz loop1
另外,检查哪些寄存器gotoxy
和writechar
程序保留,因为它们可能会更改某些寄存器。请特别检查您在循环中使用的寄存器。
答案 1 :(得分:0)
您应该移动push ecx
下的row:
标签,pop ecx
之前loop
正在吃堆栈的值,因为没有推送。
你也应该遵循@johnfound的答案,因为那些是好的推荐(dec + jnz,子程序可能会修改寄存器值)。
编辑:
此外,mov ecx, a
和b
以及d
实际上使用的变量地址可能非常大,应为mov ecx, [a]
或{{1} (asm生锈)。也许mov ecx, dword ptr [a]
和inc
可能需要类似的处理