본문 바로가기
코스웨어/15년 스마트컨트롤러

20150820-19번-안향진-일일업무일지 - 어셈블리 컴파일

by 알 수 없는 사용자 2015. 8. 21.
728x90
반응형

==========================================================================================

ASSEMBLY

==========================================================================================



=STATEMENTS (소스 코드, 명령어)

name          mnemonic      operand(s)     ;comment

: ZeroCount    mov            ecx, 0          ; initialize count to zero


                mnemonic      operand(s)                                  => 보통 사용 형태

:               add            eax, 158                                      => name, 주석 X

: addLoop:     add            eax, 158                                       => 주석 X

:               jmp            addLoop       ; repeat addition           => name X

: EndIfBlank:                                                           => name 만 있음



=DIRECTIVE ( .~ ) : 어셈블러에게 전달

.NOLIST

: .386          ; 이 프로그램 실행은 최소 386이상 프로세서에서 동작

: .MODEL FLAT ; 메모리 영역구분없이 나열 되어있다(<->SEGMENT)



=함수

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD (정리 후 종료됨 : 반드시 사용(초보자))



= INCLUDE

: INCLUDE io.h          ;#include <io.h>


=16진수 

: 0~h                  ; 0x0~




=컴파일러 설치


80x86 assembly.zip 압축풀기 -> Software -> Setup -> SETUP.EXE 실행


-경로 : C:\asm





=컴파일


-C:\asm\Software 에 소스파일(main.asm) 생성, 코딩


1. obj 생성


ml /c /coff 소스파일명










=실행파일 생성


link /subsystem:console /entry:start /out:실행파일명 obj파일명 io.obj kernel32.lib









=.CODE


1.

 .CODE
_start:                        ; entry point
  output  prompt1        ; 
"io.h"에서 정의된 매크로 함수 => printf 호출
  input   string, 
40        ; => scanf : 문자열 입력(40글자까지)
  atod  string               ; 아스키코드문자 
=> DWORD로 변환 => eax에 저장



2.

  mov  number1, eax      ; (대입연산자 =) : number1 = eax;

  output  prompt2        
  input  string, 
40
  atod  string





3.

   mov  number2, eax      ; number2 = eax;

  mov  eax, number1      ; eax 
= number1;
  add  eax, number2      ; eax 
= eax + number2;  // accumulator (ACC)





<main.asm>

.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD  ; 함수

INCLUDE io.h

cr  EQU  
0dh                                    ; #define cr 0x01byte
Lf  EQU  
0ah                                    ; #define cr 0x01byte

.STACK  
4096                                   ; stack 4096bytes

.DATA      ; 전역변수
number1 DWORD ?
number2 DWORD ?                             ; DWORD - 
4bytes, ? - 초기화 X

prompt1  BYTE  "Enter first number: ",0  ; 문자열 "~"로 초기화, ,0 - null 추가
prompt2 BYTE  
"Enter secont number: ",0

string  BYTE  40 DUP  (?)                    ; 배열 40bytes, 복사(? - 쓰레기 값)

label1  BYTE  cr, Lf, 
"The sum is "
sum   BYTE  11 DUP  (?)
  BYTE  cr, Lf, 
0                               ; 이름 없이 메모리만 차지
                                                    ; 
1byte + 1byte + 1byte = 3bytes
.CODE
_start:                                             ; entry point
  output  prompt1                              ; 
"io.h"에서 정의된 매크로 함수 => printf 호출
  input   string, 
40                             ; => scanf : 문자열 입력(40글자까지)
  atod  string                                    ; 아스키코드문자 
=> DWORD로 변환 => eax에 저장
  mov  number1, eax                           ; (대입연산자 
=) : number1 = eax;

  output  prompt2        
  input  string, 
40
  atod  string
  mov  number2, eax                           ; number2 
= eax;

  mov  eax, number1                           ; eax 
= number1;
  add  eax, number2                            ; eax 
= eax + number2;  // accumulator (ACC)
  dtoa  sum, eax                                ; DWORD => 아스키코드문자로 sum에 저장
  output  label1                                  ; 변수명이 주소(위치정보)

  INVOKE  ExitProcess, 
0

PUBLIC   _start







-소스코드




<main.asm>

.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD  ; 함수

INCLUDE io.h

cr  EQU  
0dh                                     ; #define cr 0x01byte
Lf  EQU  
0ah                                     ; #define cr 0x01byte

.STACK  
4096                                    ; stack 4096bytes

.DATA      ; 전역변수
number1 DWORD ?
number2 DWORD ?                              ; DWORD - 
4bytes, ? - 초기화 X

prompt1  BYTE  "Enter first number: "      ; 문자열 "~"로 초기화, NULL 없음
prompt2 BYTE  "Enter secont number: ",0


string  BYTE  40 DUP  (?)                     ; 배열 40bytes, 복사(? - 쓰레기 값)

label1  BYTE  cr, Lf, 
"The sum is "
sum   BYTE  11 DUP  (?)
  BYTE  cr, Lf, 
0                                ; 이름 없이 메모리만 차지
                                                    ; 
1byte + 1byte + 1byte = 3bytes
.CODE
_start:                                             ; entry point
  output  prompt1                               ; 
"io.h"에서 정의된 매크로 함수 => printf 호출
  input   string, 
40                             ; => scanf : 문자열 입력(40글자까지)
  atod  string                                    ; 아스키코드문자 
=> DWORD로 변환 => eax에 저장
  mov  number1, eax                           ; (대입연산자 
=) : number1 = eax;

  output  prompt2        
  input  string, 
40
  atod  string
  mov  number2, eax                          ; number2 
= eax;

  mov  eax, number1                          ; eax 
= number1;
  add  eax, number2                           ; eax 
= eax + number2;  // accumulator (ACC)
  dtoa  sum, eax                               ; DWORD => 아스키코드문자로 sum에 저장
  output  label1                                 ; 변수명이 주소(위치정보)

  INVOKE  ExitProcess, 
0

PUBLIC   _start






-소스코드


728x90