Assembly 我想不出如何摆脱无限循环
这是包含多个循环的代码,我需要修复这个无限循环。有人能修好吗Assembly 我想不出如何摆脱无限循环,assembly,x86,masm,Assembly,X86,Masm,这是包含多个循环的代码,我需要修复这个无限循环。有人能修好吗 .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 wr
.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
帮助无限循环。不要使用
循环
指令创建嵌套循环
我不知道为什么,但最近,有许多初学者试图通过使用loop
指令(和MASM)来创建几个嵌套循环。这些可能是一些愚蠢的老师在思考如何在汇编中创建嵌套循环
所以,住手!这是一种糟糕的做法。忘记循环
指令,对循环计数器使用单独的寄存器。它是如此简单明了:
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过程保留的寄存器,因为它们可能会更改一些寄存器。特别要检查循环中使用的寄存器。您应该将
推ecx
移动到行下:
标签,循环之前的最后一个弹出ecx
正在读取堆栈的值,因为没有推送
您还应该遵循@johnfound answer,因为这些都是很好的建议(dec+jnz和子例程可能会修改寄存器值)
编辑:
另外,
mov ecx,a
和b
和d
实际上使用的变量地址可能非常大,应该是mov ecx,[a]
或者可能是mov ecx,dword ptr[a]
(asm rusty)。也许inc
和dec
可能需要类似的治疗这给了我一个无限循环。有人有任何意见吗?是的,但我对这个特定问题使用了循环。你能看到上面代码中的任何错误吗?@ngoche看到我答案的最后一段。我照你说的做了,但还是一样的。