.386
.MODEL FLAT

;함수 사용  선언(ExitProcess 함수이름 이며 반환형은 DWORD)
ExitProcess PROTO NEAR32 stdcall, dxExitCode:DWORD

;헤더파일 인클루드
INCLUDE io.h

cr EQU 0dh         ;0dh => 0x0d (h 는 16진수를 나타낸다.)#define 효과
Lf EQU 0ah         ; EQU는 (=) 과 같다

.STACK 4096        ;스택영역을 4096만큼 확보(사용할 메모리 공간 확보)

.DATA          ;변수 영역 시작
number1  DWORD ?       ;4바이트로 변수 선언
number2  DWORD ?
prompt1   BYTE "Enter first number: ",0  ;문자를 바이트 단위로 할당하고 마지막에 0을 넣는다.
                                                         0은 문자열로 넣지 않고 (,0) 을 사용

prompt2  BYTE "Enter second number: ",0
string     BYTE 40 DUP (?)                ;BYTE 단위를 40개를 DUP(할당) 한다. (?) 는 초기화
                                                      하지 않는다는 말
label1    BYTE cr, Lf, "The Sum is "  ;cr Lf 는 위에서 정의 한 값인 16진수를 사용(\n\r)효과
sum       BYTE 11 DUP (?)
             BYTE cr, Lf, 0                    ;변수명 없이 메모리만 할당(sum뒤에 이어서 cr과Lf
                                                      그리고 0이 오게된다.

.CODE                                      ;코드영역의 시작
_start:                                       ;start함수 (시작 지점을 의미)
   output prompt1                        ;output 은 메크로함수로 화면에 출력을 하는 메크로다.
   input string,40                         ;input은 입력을 받는 메크로다. 40바이트 만큼
   atod string                              ;atod는 아스키 코드를 10진수로 변환 하는 메크로다.
                                                (DWORD형으로저장후 레지스터eax에 넣어준다.)
   mov  number1,eax                    ;eax의 내용을 number1에 넣어준다. mov는 복사해주는
                                                역할을 한다.
   
   output prompt2
   input string,40
   atod string                              ;위에서 연산된 값은 지워지고 새로운 값이 eax에 저장된다.
   mov  number2,eax
   
   mov  eax,number1    
   add  eax,number2                    ;뒤에값을 앞에 값과 더해 앞에 공간에 넣어준다.
                                                 (a = a+ b 와 같다.)
   dtoa sum,eax                          ;eax에 있는 숫자를아스키 코드로 바꿔준다.(sum에 아스키
                                                 로  바꾼 값을 담아준다.)
   output label1                           ;label1 BYTE cr, Lf, "The Sum is " 으로 정의 되어 있는
                                                곳에 널문자가 없어
                                                ;다음에 있는 sum부분의 널을 만날때까지 계속 출력한다.
   INVOKE ExitProcess,0              ;INVOKE는 함수를 호출하라는 명령어 함수명은
                                                ExitProcess며 인자는 0이다.
   
PUBLIC _start                             ;PUBLIC 을 사용해서 외부로 부터의 접근을 허용한다.

END                                          ;프로그램 종료를 알리는 부분


위에서 사용된 input output 과 atod , dtoa 등은 메크로로 화면에 출력 ,입력받기,아스키를 10진수로 변환, 10진수를 아스키로 변환 하는등의 역할을 한다.  어셈블리어 코드가 아니며 따로 정의되어 있는 오브젝트 파일을 링킹시켜야 사용 가능하다.

Posted by 응이

Dream come true.
응이

달력

태그목록