[ Chapter 1 ]
★ nasm 컴파일은 아래와 같은 경로에서 받을수 있다.
★ nasm 컴파일
Ex) asm_io.asm 파일 내부 |
%define NL 10 |
ㆍ위 파일을 컴파일하여 obj 파일을 생성 할 수 있다.
Ex) first.asm 파일 내부 |
%include "asm_io.inc" |
ㆍ위와 동일한 방법으로 obj 파일 생성
Ex) print 종류의 함수를 사용하기위한 asm_io.inc |
extern read_int, print_int, print_string |
Ex) drive.c 파일 내부 |
#include <stdio.h> |
ㆍ위와 동일한 방법으로 obj 파일 생성
ㆍ아래와 같이 3개의 obj 파일을 LINK 하면 EXE 파일이 생성된다.
< 실행 결과 >
★ ASSEMBLY LANGUAGE
ㆍ주석
C : //, /* */
asm : ;
ㆍ대입
C : dest = src;
asm : mov dest, src
ㆍ덧셈
C : eax = eax + 4;
asm : add eax, 4
C : al = al + ah;
asm : add al, ah
ㆍ뺄셈
C : bx = bx - 10;
asm : sub bx, 10
C : ebx = ebx - edi;
asm : sub ebx, edi
ㆍ증가, 증감 연산자
C : ecx++;
asm : inc ecx
C : dl--;
asm : dec dl
ㆍ전처리 방법
C : #define PI 3.14
asm : %define equ 3.14
ㆍ변수 선언
( 어셈블리는 변수가 아닌 주소로 접근 하기 때문에 void 포인터라 본다 )
C : char L1 = 0;
asm : L1 db 0
L3 db 110101b
※ 어셈블리는 초기화의 b 를 붙여 2진수로 초기화가 가능하다.
L4 db 12h
※ 어셈블리는 초기화의 h 를 붙여 16진수로 초기화가 가능하다.
L6 dd 1A92h
※ double word(4byte) 형으로 16진수로 초기화 되었다.
L7 resb 1
※ resb 는 배열과 같은 긴데이터를 생성하는데 res 는 값을 넣지 않는다는 뜻이다.
L8 db "A"
※ 1byte 크기의 A의 아스키 코드를 초기화
L9 0, 1, 2, 3
※ 4byte 크기의 4개의 초기화
L10 "w", "o", "r", 'd', 0
※ 5byte 크기의 C의 문자열 "word" 와 유사하며 마지막의 NULL은 셀프로 항상 넣어 주어야 한다.
※ (" "), (' ') 둘다 사용가능
Unit | Letter |
byte | B (1byte) |
word | W (2byte) |
double word | D (4byte) |
quad word | Q |
ten bytes | T |
L12 times 100 db 0
※ db 크기의 0을 100번 반복
L13 resw 100
※ 초기화가 안된 200byte 크기를 뜻함
mov al, [L1]
※ 대괄호를 쳐야 L1의 값을 al에 대입한다.
mov eax, L1
※ eax 는 4byte크기의 레지스터이며 대괄호가 없으면 L1의 주소값이 대입된다.
mov [L1], ah
※ ah 값을 L1의 주소에 대입.
mov [L6], 1
※ L6 의 주소에 1을 넣는다.
※ 위의 방법은 1의 크기를 컴파일이 알지 못한다. 아래의 방법으로 해결한다.
mov dword [L6], 1
ㆍC언어는 컴파일러가 형동등성에 의해 대입시에 편의를 봐준다.
ㆍ어셈블리는 대입시에 모든 값에 캐스팅을 통해 형을 정해주어야 한다.
★ 어셈블리의 print
ㆍ어셈블리는 printf 가 없다.
%include "asm_io.inc"
ㆍ위 파일에서 printf 함수를 제공해 준다.
print_int | eax | eax 값을 정수로 출력한다. |
print_char | eax 값을 문자로 출력 한다. | |
print_string | eax | eax 값을 문자열 출력 |
print_nl | 엔터 (\n) | |
read_int | eax | 숫자를 입력 받는다. |
read_char | eax | 문자를 입력 받는다. |
Dump_regs | 레지스터값을 16진수로 출력 FLAGS 의 bit도 출력 | |
Dump_mem | 메모리를 출력한다. | |
Dump_stack |
ㆍ어셈블리에서는 메모리 영역을 따로 생성 해주어야 한다.
segment .data
segment .bss
segment .text ( code 영역 )
global _asm_main
※ global 은 외부에서 함수를 볼수있게 한다.
ㆍ어셈블리의 문자열은 다음과 같이 생성한다.
prompt1 db "Enter a number : ", 0
ㆍreturn 은 어셈블리에서 ret 로 표시한다.
ㆍpusha : a 는 all 을 뜻하고 push 는 메모리에 모두 넣고 esp ( top of stack )를 위로 올린다.
ㆍpopa : pop은 push로 넣은 정보의 레지스터를 초기화 해준다.
ㆍ함수 호출은 다음과 같다.
mov eax, prompt1
call print_string
ㆍprompt1 (문자열) 의 주소를 eax 에 넣고 위 함수를 호출하면 prompt1 의 문자열이 출력 된다.
Ex) 출력 |
%include "asm_io.inc" |
< 실행 결과 >
ㆍ입력받는 함수
call read_int
mov [input1], eax
ㆍinput1에 C의 sanf 와 같이 입력 받는다.
ㆍdump_regs : 레지스터 값을 16진수로 출력한다.
ㆍdump_mem : 메모리를 출력한다.
ㆍ어셈블리에서 함수를 호출할 때 함수이름 앞에 언더바( _ ) 를 붙인다.
_asm_main :
-l ileName
ㆍDOS에서 어셈블리 파일의 메모리값을 보여준다.
'코스웨어 > 12년 내장형하드웨어' 카테고리의 다른 글
매트릭스 화면보호기 입니다. by. 감정현 (0) | 2012.08.22 |
---|---|
NFL 강남스타일 터치다운 세레모니 - 싸이 대단!! (1) | 2012.08.22 |
레지스터 클래스 (2) | 2012.08.22 |
형동등성 (0) | 2012.08.22 |
어셈블리어 기초인 데이터 크기 표기법. (0) | 2012.08.22 |
캐릭터 LCD TEST 소스 (0) | 2012.08.20 |
lcd 화면에 글자찍기 (1) | 2012.08.20 |
이력서 쓰기 넘 난감해 자료 구함 (1) | 2012.08.18 |