부트로더 디렉터리 기본 구조
Make 프로그램
•
기본 문법
•
기본 예제
•
root/makefile
all: BootLoader Disk.img
BootLoader:
@echo
@echo ============== Build Boot Loader ==============
@echo
make -C 00.BootLoader
@echo
@echo ============== Build Complete ==============
@echo
Disk.img: 00.BootLoader/BootLoader.bin
@echo
@echo ============== Disk Image Build Start ==============
@echo
cp 00.BootLoader/BootLoader.bin Disk.img
@echo
@echo ============== All Build Complete ==============
@echo
clean:
make -C 00.BootLoader clean
rm -f Disk.img
C
복사
•
BootLoader/makefile
all: BootLoader.bin
BootLoader.bin: BootLoader.asm
nasm -o BootLoader.bin BootLoader.asm
clean:
rm -f BootLoader.bin
C
복사
기본 부트로더
•
주 어셈블리어 정리
그룹 | 명령어 | 설명 |
inc A | A의 값 1 증가 | A++ | |
사칙 연산 | add A, B | A에 B의 값을 더한 후 A에 저장
A = A + B |
sub A,B | A에서 B의 값을 뺀 후 A에 저장
A = A - B | |
mul A | AX의 레지스터 값과 A의 값을 곱한 후 AX 또는 DX:AX에 저장
AX / DX:AX = AX * A | |
dec A | A의 값 1 감소 | A— | |
div A | AX 또는 DX:AX의 값을 A로 나누어 몫과 나머지를 각각 AL, AH / AX, DX에 저장
AX / DX:AX = AL...AH / AX...DX | |
논리 연산 | and A, B | A에 B의 값을 AND하여 A에 저장 |
or A, B | A에 B의 값을 OR하여 A에 저장 | |
xor A, B | A에 B의 값을 XOR하여 A에 저장 | |
not A | A의 값을 반전(0→1, 1→0)하여 A에 저장 | |
* 대입 및 분기 | mov A, B | B에서 A로 값 이동 |
cmp A, B | 두 값을 비교하여 결과를 FLAGS 레지스터로 이동 | |
jmp A | 무조건 해당 주소로 이동하여 A 위치의 코드 수행 | |
je, ja, jb, jz, jne, ina, jab, jnz A | - 조건 분기 명령
- FLAGS 레지스터의 값에 따라 jmp 수행
- 일반적으로 cmp 명령과 함께 사용
- Equal(e), Above(a), Bellow(b), Zero(z), Not(n) 등의 다양한 조건 포함 | |
함수 호출 | call A | - 스택에 call 명령 다음 주소를 삽입하고 A 위치 코드 실행
- 함수 호출 용도로도 사용 |
ret A | 스택에 A만큼 줄인 후에 되돌아갈 주소를 꺼내 해당 주소의 코드를 실행
일반적으로 call 명령과 짝을 이루어 사용 | |
스택 | push A | A의 값을 스택에 저장 |
pop A | 스택에서 값을 꺼내 A에 저장 | |
인터럽트 | int A | A번째 소프트웨어 인터럽트를 발생 |
cli | 인터럽트를 발생 불가능하도록 설정 | |
sti | 인터럽트를 발생 가능하도록 설정 | |
I/O 포트 제어 | in A, B | - I/O 포트 B에서 값을 입력받아 A에 저장
- 주변 장치에서 값을 읽은 용도로 사용 |
out B, A | - A의 값을 I/O 포트 B에 출력
- 주변 장치에 값을 쓰는 용도로 사용 | |
주석 | ; | 주석 |
•
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
jmp $ ; 현재 위치에서 무한 루프 수행
times 510 - ($ - $$) db 0x00 ; $: 현재 라인의 어드레스
; $$: 현재 섹션(.text)의 시작 어드레스
; $ -$$: 현재 섹션을 기준으로 하는 오프셋
; 510 - ($ - $$): 현재부터 어드레스 510까지
; db 0x00: 1바이트를 선언하고 값은 0x00
; time: 반복수행
; 현재 위치에서 어드레스 510까지 0x00으로 채움
db 0x55 ; 1바이트를 선언하고 값은 0x55
db 0xAA ; 1바이트를 선언하고 값은 0xAA
; 어드레스 511, 512에 0x55, 0xAA를 써서 부트 섹터로 표기함
C
복사