2012-04-19 1 views
0

У меня есть простая программа, которая добавляет 1 + 1, пока не достигнет миллиона, а затем печатает «Готово!». на консоль. Но когда он работает, он ничего не делает. Вот код:x86 assembly- Простая арифметическая программа не работает, MASM32 на xp

.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, щелкая и перетаскивая его в подсказку и нажимая enter. А также, MASM32 самый простой ассемблер, чтобы узнать, или там лучше и проще? Если да, может ли кто-нибудь опубликовать те, которые лучше? Благодарю. Мне просто нужно где-то начать изучение сборки x86.

Спасибо заранее,

Progrmr

+0

Я сомневаюсь, что вы найдете любые другие ассемблер заметно проще в использовании. То, с чем вы боретесь, - это язык ассемблера x86, а не сама ассемблерная программа. Тем не менее, некоторые люди предпочитают NASM (http://www.nasm.us/), над MASM. –

ответ

5

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

+0

Спасибо Карлу Норуму! Это работает отлично. – Progrmr

+0

@Progrmr: Если этот ответ решил вашу проблему, вы должны принять его. – Job

+0

Извините, я не знал, что это значит. Но теперь я это делаю. – Progrmr

1

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

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

_loop: 
mov eax, 1   ;eax set to 1 

Нет необходимости Mov значение в EAX - тест против EAX непосредственно.

mov main, eax 

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

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: 
... 
0
.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 
+0

Было бы неплохо, если бы вы могли добавить некоторое объяснение, почему ваше решение работает в отличие от кода OP. – honk