Search

makefile, 기본 부트로더 제작

대분류
CS
소분류
OS
유형
C
Makefile
주요 레퍼런스
https://hyun1205.tistory.com/59?category=799216
https://itguava.tistory.com/11
최종 편집 일시
2024/10/27 15:50
생성 일시
2022/04/04 01:48
14 more properties

부트로더 디렉터리 기본 구조

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, 5120x55, 0xAA를 써서 부트 섹터로 표기함
C
복사