2

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

   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  

结束开始

4

3 回答 3

3

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

于 2013-01-22T06:09:45.873 回答
1

就像@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

您还可以使用pushadandpopad来将所有通用寄存器值推入和弹出堆栈。

; push general-purpose registers values onto stack
pushad
invoke StdOut, addr star
; restore general-purpose registers
popad
于 2013-07-20T23:17:58.603 回答
0

您可能将汇编指令与宏混淆了。.while 不是汇编指令,它是一个宏。所有以“。”开头的指令都相同。

于 2013-01-20T07:26:51.887 回答