我无法弄清楚如何摆脱无限循环

时间:2013-11-06 05:31:25

标签: 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 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

帮助无限循环。

2 个答案:

答案 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

另外,检查哪些寄存器gotoxywritechar程序保留,因为它们可能会更改某些寄存器。请特别检查您在循环中使用的寄存器。

答案 1 :(得分:0)

您应该移动push ecx下的row:标签,pop ecx之前loop正在吃堆栈的值,因为没有推送。

你也应该遵循@johnfound的答案,因为那些是好的推荐(dec + jnz,子程序可能会修改寄存器值)。

编辑:

此外,mov ecx, ab以及d实际上使用的变量地址可能非常大,应为mov ecx, [a]或{{1} (asm生锈)。也许mov ecx, dword ptr [a]inc可能需要类似的处理