我是汇编语言的新手。所以开始编写小程序。我写了一个基本的循环程序来打印“*”金字塔。但程序进入无限循环。我正在粘贴下面的代码。有人可以帮忙吗? 开始:
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
结束开始
答案 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
您还可以使用pushad
和popad
来推送/弹出堆栈上和堆栈外的所有通用寄存器值。
; push general-purpose registers values onto stack
pushad
invoke StdOut, addr star
; restore general-purpose registers
popad