x86汇编 - 简单的算术程序不工作,xp上的MASM32

时间:2012-04-19 02:35:18

标签: assembly x86 masm32

我有一个简单的程序,它增加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运行它,通过单击并将其拖动到提示并按Enter键。而且,MASM32是最容易学习的汇编程序,还是有更好更容易的汇编程序?如果是这样,有人可以发布那些更好的吗?谢谢。我只是需要一个地方开始学习x86汇编。

提前致谢,

Progrmr

3 个答案:

答案 0 :(得分:5)

您的程序不会增加任何内容。你可能想在那里找一条add指令。

答案 1 :(得分:1)

有各种各样的错误。为了清楚和其他用户阅读这篇文章...

每个循环都将EAX设置为1:

_loop:
mov eax, 1         ;eax set to 1

无需在eax中移动值 - 直接针对eax进行测试。

mov main, eax

OP希望每次增加1,因此缺失的指令是“inc eax” - 不需要“添加”:

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

答案 2 :(得分: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