Pergunta

Eu estou tentando fazer um loop em masm32 em execução no Windows Vista, no entanto eu fiz isto deste modo e mesmo que ele realmente termina o loop, ele trava e não vejo nenhuma razão óbvia por que ... alguma idéia?

.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

Editar

Did

invoke StdOut, offset ProgramText

Ainda acidentes ...

Foi útil?

Solução

Você precisa ter uma "saída" para acabar com a sua aplicação. Além disso, o meu estilo pessoal é colocar tudo dentro de uma sub-rotina, mas isso é só comigo.

algo como:
.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

end start

Outras dicas

Parece-me que a ordem das suas instruções está errado. Você fazer uma comparação, em seguida, um decréscimo, em seguida, um salto condicional. Seus valores bandeira da comparação, eventualmente, ser alterada pelo decréscimo.

  loop_start:

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

  ret

Quando eu estava fazendo a montagem de programação, eu fiz isto deste modo:. Diminuir o contador, então loop se não zero

 loop_start:

  invoke StdOut, addr ProgramText

  dec loop_stopper
  jnz loop_start

  ret

É claro que, dependendo do processador, você pode colocar o loop-variável num registo que lhe permite diminuir e loop usando uma única instrução. (Por exemplo o Z80 'djnz' instruction. Não me lembro de volta tão longe que registar que realmente era, embora o registo 'B' parece tocar um sino).

Além disso, como alguns têm sugerido, você não parecem estar a limpeza de seu espaço de memória. A maioria dos programas são realmente 'chama de' a seu código. Portanto, você precisa preservar ponteiros de código e de pilha para que você faça um "retorno" graciosa para a parte chamando do sistema operacional. Se você não tiver feito isso, seu 'retorno' pode levá-lo para onde quer que o topo da pilha passa a ser apontando, geralmente com consequências desastrosas.

ClubPetey é certo. MASM não produzir um epiloge para o seu código. Assim, o processador continua a execução do que ele encontra por trás da última instrução escrita. saída pede explicitamente o sistema operacional pare de executar o programa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top