2013-10-14 6 views
1

Я новичок в ASM. Я пытаюсь выполнить простую задачу - сумма чисел от 1 до 100, eax будет содержать сумму.
например: 1 + 2 + 3 + .. + 100Сумма чисел от 1 до 100

Так вот соответствующий код:

XOR eax, eax ;; Set eax to 0 
MOV ecx, 100 ;; We will loop 100 times 
my_loop: 
    ADD eax, ecx ;; We add the ecx register value to eax, ecx decreses by 1 every iteration untill he reaches 0 
LOOP my_loop 
    ;;Exit the program, eax is the exit code 
push eax 
call ExitProcess 

Когда я отлаживать файл EXE, eax является равным 0. Как это возможно?

BTW, есть ли простой способ распечатать значение EAX на консоли, вместо того чтобы открывать Windbg, чтобы проверить его значение?

+0

вы не показывать большую часть своего кода, но так как вы звоните 'ExitProces s' Я предполагаю, что вы связываетесь с Windows API. Таким образом, у вас должен быть доступ к 'MessageBox' как средство появления окна с некоторой информацией. Вы также можете использовать 'invoke'. – lurker

+0

@mbratch Я связываю его с masm32 и kernel32, так или иначе, программа должна работать, и eax действительно должен иметь сумму 1 + 2 + 3 + .. + 100? – idish

+0

Вы спросили в своем посте о том, как отображать значения без отладчика, так что это было мое предложение. Вы также можете найти 'int 21h', если используете консоль. Я не уверен, почему 'eax' будет' 0', если отладчик не покажет его вам в этом месте (прямо до или после 'push'). – lurker

ответ

0

Этой программу, немного адаптированные для FreshLib работает как шарм Ядро программы является то же самым, я просто добавил некоторые консольный вывод (и. ну, это синтаксис FASM) Таким образом, вы просто пропустили заметить, что программа работает правильно.

include "%lib%/freshlib.inc" 

@BinaryType console 

include "%lib%/freshlib.asm" 

start: 
     InitializeAll 

     XOR eax, eax ;; Set eax to 0 
     MOV ecx, 100 ;; We will loop 100 times 
my_loop: 
     ADD eax, ecx ;; We add the ecx register value to eax, ecx decreses by 1 every iteration untill he reaches 0 
     LOOP my_loop 
    ;;Exit the program, eax is the exit code 
     mov ebx, eax 

     stdcall NumToStr, ebx, ntsDec or ntsSigned 
     stdcall FileWriteString, [STDOUT], eax 

     stdcall FileReadLine, [STDIN] ; in order to pause until ENTER is pressed. 

     stdcall TerminateAll, ebx 

@AllDataEmbeded 
@AllImportEmbeded 
+0

Спасибо, есть ли простой способ открыть консоль, чтобы я мог увидеть результат? XD – idish

+0

@idish - ну, я добавил его к ответу. И до тех пор, пока «ExitProcess» была единственной функцией Win32, я заменил ее «TerminateAll». Таким образом, программа может быть скомпилирована для Windows и Linux - просто установите% TargetOS% на Win32 или Linux соответственно. – johnfound

+0

Прошу прощения за то, что здесь немного не по теме. Но в настоящее время я использую редактор MASM32. Я знаю, что emu8086 позволяет видеть значения регистров, память и т. Д. Как я могу достичь этой задачи тоже в своем редакторе? – idish

0

Это работает, хотя я использую библиотеку Irvine32.inc для печати моего результата, просто используйте свой собственный метод для печати. Результат по-прежнему находится в EAX

TITLE SOF_Sum 

INCLUDE Irvine32.inc ;may remove this and use your own thing 

.code 

MAIN PROC 
    MOV EAX, 0 ; or XOR EAX, EAX - sets eax to 0 
    MOV ECX, 100 ; loop counter - our loop will run 100 times 

    myloop: 
     ADD EAX, ECX ; adds ECX to EAX 
    loop myloop 

    call writedec ;displays decimal version of EAX, from Irvine32.inc, replace 

exit 
main ENDP 
END main 

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

Надеется, что это помогает (:.

JLL

-2
assume cs:code,ds:data 
data segment 
org 2000h 
series dw 1234h,2345h,0abcdh,103fh,5555h 
sum dw 00h 
carry dw 00h 
data ends 
code segment 
start:mov ax,data 
mov ds,ax 
mov ax,00h 
mov bx,00h 
mov cx,05h 
mov si,2000h 
go:add ax,[si] 
adc bx,00h 
inc si 
inc si 
dec cx 
jnz go 
mov sum,ax 
mov carry,bx 
mov ah,4ch 
int 21h 
code ends 
end start 
+2

Как это ответить на вопрос? Это просто некорректно отформатированный дамп безкомментированного кода без каких-либо объяснений. – Michael

Смежные вопросы