2013-10-14 2 views
1

나는 ASM에서 초보자입니다. 간단한 작업을 수행하려고합니다. 1에서 100 사이의 숫자의 합계가 eax입니다.
예컨대 : 1 + 2 + 3 + .. + 1001에서 100 사이의 숫자의 합

그래서 여기에 관련 코드 : I가 exe 파일을 디버깅 할 때

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 

, eax이 0되고있는 것은 어떻게 가능합니까?

사실, 값을 확인하기 위해 Windbg를 열지 않고 콘솔에 EAX의 값을 인쇄하는 쉬운 방법이 있습니까?

+0

당신은 당신의 코드를 많이 표시되지하고 있지만 ss' 나는 당신이 Windows API와 연결되어 있다고 가정합니다. 그래서, 당신은 어떤 정보를 가지고 창을 띄우는 수단으로'MessageBox'에 접근해야합니다. 'invoke'를 사용할 수도 있습니다. – lurker

+0

@mbratch 필자는 masm32와 kernel32를 연결하고 있습니다. 어쨌든 프로그램은 작동해야하고 eax는 실제로 1 + 2 + 3 + .. + 100의 합계를 가져야합니까? – idish

+0

당신은 디버거없이 값을 표시하는 방법에 대한 귀하의 게시물에 물어 보았습니다, 그래서 제 제안이었습니다. 콘솔을 사용한다면'int 21h'를 찾아 볼 수도 있습니다. 왜 디버거가 그 위치 ('push '의 직전이나 직후)에 그것을 보여주지 않는 한'eax'가'0'이 될지 모르겠습니다. – lurker

답변

0

에게이 프로그램은, 마치 마법처럼 FreshLib 작품에 맞게 약간 프로그램의 핵심은 동일, 난 그저 약간의 콘솔 출력을 추가 (및 당신은`ExitProce를 호출하고 있기 때문에 음, 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