Сборка x86 - простая арифметическая программа не работает, MASM32 на xp

У меня есть простая программа, которая добавляет 1+1, пока не достигнет миллиона, а затем выдает "Готово!" на консоль. Но когда он работает, он ничего не делает. Вот код:

.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
          main dd 0
          msg  db "Done!", 0
.code      
start:      
_loop:    mov eax, 1 
          mov main, eax
          cmp main, 1000000
          jz _next
          jmp _loop
_next:    invoke StdOut, addr msg
          invoke ExitProcess, 0
end start

Он ничего не делает, когда я запускаю его. Я не понимаю почему. В настоящее время я запускаю его через cmd, щелкая и перетаскивая его на приглашение и нажимая ввод. А также, является ли MASM32 самым простым в освоении ассемблером, или есть лучшие и более простые? Если так, может кто-то опубликовать те, которые лучше? Благодарю. Мне просто нужно где-то начать изучать сборку x86.

Заранее спасибо,

Progrmr

3 ответа

Решение

Ваша программа ничего не увеличивает. Вы, вероятно, хотите add инструкция там где-то.

Есть разные ошибки. Для ясности и других пользователей читающих этот пост...

EAX устанавливается на 1 в каждом цикле:

_loop:
mov eax, 1         ;eax set to 1

Нет необходимости перемещать значение в eax - напрямую протестировать eax.

mov main, eax

ОП хочет увеличивать на 1 каждый раз, поэтому отсутствующая инструкция "inc eax" - "add" не требуется:

start:
xor eax,eax     ;eax=0
_loop:          ;Begin loop
  inc eax         ;Increment eax by 1 each loop
  cmp eax,1000000 ;Compare
  je _next        ;Done - exit loop
  jmp _loop       ;Continue loop

_next:
...
.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
    main dd 0
    msg  db "Done!", 0
.code      
start:      
    mov     eax,1               ;set eax register to 1
IncreaseBy_1:
    inc     eax                 ;increase eax by 1
    cmp     eax,1000000         ;compare eax to 1000000
    jnz     IncreaseBy_1        ;jump if eax not equal to 1000000 
_next:    
    invoke  StdOut,addr msg
    invoke  ExitProcess,0
end start
Другие вопросы по тегам