我正在尝试在Windows Vista下运行masm32中的循环,但是我这样做了,即使它实际上完成了循环,但它崩溃了,我看不出明显的原因......任何想法?
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
ProgramText db "Looping!", 0
.data?
loop_stopper dd ?
.code
start:
mov loop_stopper,2
loop_start:
invoke StdOut, addr ProgramText
cmp loop_stopper, 0
dec loop_stopper
jg loop_start
end start
修改
invoke StdOut, offset ProgramText
仍然崩溃......
答案 0 :(得分:5)
您需要有一个“退出”来结束您的申请。另外,我的个人风格是将所有内容都放在子程序中,但那只是我。
类似的东西:
.code
start:
call main
inkey
exit
main proc
mov loop_stopper,2
loop_start:
invoke StdOut, addr ProgramText
cmp loop_stopper, 0
dec loop_stopper
jg loop_start
ret
main endp
call main
inkey
exit
答案 1 :(得分:2)
在我看来,你的指示顺序是错误的。你进行比较,然后是减量,然后是条件跳跃。比较中的标志值可能会因减量而改变。
loop_start:
invoke StdOut, addr ProgramText
cmp loop_stopper, 0
dec loop_stopper
jg loop_start
ret
当我进行汇编编程时,我这样做了:递减计数器,然后循环,如果非零。
loop_start:
invoke StdOut, addr ProgramText
dec loop_stopper
jnz loop_start
ret
当然,根据处理器的不同,您可以将循环变量放在一个寄存器中,该寄存器允许您使用单个指令递减和循环。 (例如Z80'djnz'指令。我记不起它实际上是哪个寄存器,尽管'B'寄存器似乎敲响了钟声。)
此外,正如其他人所建议的那样,您似乎没有清理内存空间。大多数程序实际上都是代码的“调用”。因此,您需要保留代码和堆栈指针,以便对操作系统的调用部分进行正常的“返回”。如果你还没有这样做,你的'RETURN'可以带你到堆栈顶部指向的任何地方,通常会带来灾难性的后果。
答案 2 :(得分:1)
ClubPetey是对的。 MASM不会为您的代码生成一个epiloge。因此处理器继续执行它在最后写入的指令后面找到的内容。 exit明确要求操作系统停止执行程序。