Петля MASM32 - PullRequest
       20

Петля MASM32

1 голос
/ 10 февраля 2009

Я пытаюсь сделать цикл в masm32, работающем под Windows Vista, однако я сделал это таким образом, и хотя он фактически завершает цикл, он падает, и я не вижу очевидной причины, почему ... какие-либо идеи?

.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

все еще падает ...

Ответы [ 3 ]

5 голосов
/ 10 февраля 2009

Вам нужно иметь «выход», чтобы завершить ваше приложение. Кроме того, мой личный стиль - помещать все в подпрограмму, но это только я.

что-то вроде:
.code</p> <p>start:</p> <pre><code>call main inkey exit

основной процесс

mov loop_stopper,2
loop_start:

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

основной конец

конец начала

2 голосов
/ 10 февраля 2009

Мне кажется, порядок ваших инструкций неверен. Вы делаете сравнение, затем декремент, затем условный переход. Ваши значения флага из сравнения могут быть изменены декрементом.

  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', кажется, звонит в колокол).

Кроме того, как предлагали некоторые другие, вы, похоже, не очищаете пространство памяти. Большинство программ на самом деле «ВЫЗЫВАЕТ» ваш код. Поэтому вам нужно сохранить код и указатели стека, чтобы вы делали изящный «ВОЗВРАТ» для вызывающей части операционной системы. Если вы этого не сделали, ваш «ВОЗВРАТ» может привести вас туда, куда указывает верхушка стека, обычно с катастрофическими последствиями.

1 голос
/ 10 февраля 2009

ClubPetey прав. MASM не производит эпилог для вашего кода. Таким образом, процессор продолжает выполнение того, что он находит за последней записанной инструкцией. exit явно просит операционную систему прекратить выполнение программы.

...