首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MASM32回路

MASM32回路
EN

Stack Overflow用户
提问于 2009-02-10 04:48:07
回答 3查看 4.2K关注 0票数 1

我试图在Windows下运行在masm32中的一个循环,但是我这样做了,即使它真的完成了循环,它崩溃了,我没有明显的理由why...any想法?

代码语言:javascript
运行
复制
.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

编辑

代码语言:javascript
运行
复制
invoke StdOut, offset ProgramText

仍然坠毁..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-10 05:01:22

您需要一个“退出”来结束您的应用程序。另外,我个人的风格是把所有的东西都放在一个子程序里,但那只是我。

类似于:

.code

start:

代码语言:javascript
运行
复制
call main
inkey        
exit

main proc

代码语言:javascript
运行
复制
mov loop_stopper,2
loop_start:

invoke StdOut, addr ProgramText
cmp loop_stopper, 0 
dec loop_stopper
jg loop_start
ret

main endp

end start

票数 5
EN

Stack Overflow用户

发布于 2009-02-10 06:23:40

在我看来,你的指令顺序是错误的。你做一个比较,然后是减少,然后是有条件的跳跃。您来自比较的标志值可能会因减少而改变。

代码语言:javascript
运行
复制
  loop_start:

  invoke StdOut, addr ProgramText
  cmp loop_stopper, 0 
  dec loop_stopper
  jg loop_start

  ret

当我进行汇编编程时,我是这样做的:减少计数器,然后循环(如果不是零)。

代码语言:javascript
运行
复制
 loop_start:

  invoke StdOut, addr ProgramText

  dec loop_stopper
  jnz loop_start

  ret

当然,根据处理器的不同,您可以将循环变量放入寄存器中,从而允许您使用单个指令进行减量和循环。(例如Z80 'djnz‘指令。我不记得它到底是哪一种寄存器,尽管“B”寄存器似乎让人耳目一新。

另外,正如其他人所建议的,你似乎没有清理你的记忆空间。大多数程序实际上都是对代码的“调用”。因此,您需要保留代码和堆栈指针,以便对操作系统的调用部分执行优雅的“返回”。如果您没有这样做,您的‘返回’可以带您到任何地方的堆栈顶部恰巧指向,通常会带来灾难性的后果。

票数 2
EN

Stack Overflow用户

发布于 2009-02-10 04:56:50

ClubPetey是对的。MASM不会为您的代码生成结束语。因此处理器继续执行它在最后一条书面指令后面发现的内容。exit显式地要求操作系统停止执行程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/531085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档