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 ...
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.