Сборка 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