Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 我想不出如何摆脱无限循环_Assembly_X86_Masm - Fatal编程技术网

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看到我答案的最后一段。我照你说的做了,但还是一样的。