而masm32中的循环无限循环

时间:2013-01-20 04:53:09

标签: assembly while-loop masm32

我是汇编语言的新手。所以开始编写小程序。我写了一个基本的循环程序来打印“*”金字塔。但程序进入无限循环。我正在粘贴下面的代码。有人可以帮忙吗?  开始:

   mov ecx,2
   invoke StdOut, addr startProg

label_1:

   .while ecx > 0

   push ecx
       pop aInt

     .while aInt > 0
       invoke StdOut, addr star
       sub aInt, 1
     .endw

        dec ecx
    .endw

     ;invoke StdOut, addr newline


   jmp out_
out_:
   invoke ExitProcess, 0  

结束开始

3 个答案:

答案 0 :(得分:2)

Invoke通过__stdcall调用约定调用该方法。该惯例的一部分是EAX,ECX和EDX不会通过该调用保留。这就是为什么ECX和EAX寄存器没有递减并导致循环停止的原因。

答案 1 :(得分:0)

您可能会将汇编指令与宏混淆。 .while不是汇编指令,它是一个宏。 所有以'。'

开头的指令都是一样的

答案 2 :(得分:0)

就像@SecurityMatt所说的那样,你被困在无限循环中的原因是因为ecx的值在你StdOut的调用中被修改了。
您可以使用push保留注册表,然后使用pop恢复注册表来避免这种情况:

.while ecx > 0
   push ecx
   pop aInt
   ; preserve state of `ecx`
   push ecx
   .while aInt > 0
     invoke StdOut, addr star
     sub aInt, 1
   .endw
   ; restore ecx
   pop ecx
   dec ecx
.endw

您还可以使用pushadpopad来推送/弹出堆栈上和堆栈外的所有通用寄存器值。

; push general-purpose registers values onto stack
pushad
invoke StdOut, addr star
; restore general-purpose registers
popad