내 PC를 부팅하자
부트 로더 제작과 테스트
세상에서 가장 간단한 부트 로더
세상에서 가장 간단한 부트 로더 소스코드(BootLoader.asm)
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
jmp $ ; 현재 위치에서 무한 루프 수행
times 510 - ($ - $$) db 0x00 ; $: 현재 라인의 어드레스
; $$: 현재 섹션(.text)의 시작 어드레스
; $ - $$: 현재 섹션을 기준으로 하는 오프셋
; 510 - ( $ - $$ ): 현재부터 어드레스 510까지
; db 0x00: 1바이트를 선언하고 값은 0x00
; times: 반복 수행
; 현재 위치에서 어드레스 510까지 0x00으로 채움
db 0x55 ; 1바이트를 선언하고 값은 0x55
db 0xAA ; 1바이트를 선언하고 값은 0xAA
; 어드레스 511, 512에 0x55, 0xAA를 써서 부트 섹터로 표기함
실행 결과
어드레스 511, 512에 0x55, 0xAA 이외의 값(0x00, 0x00)을 넣은 경우 (실패)
화면 버퍼와 화면 제어
화면 최상단에 문자를 출력하는 부트 로더 소스 코드(BootLoader.asm)
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
mov ax, 0xB800 ; AX 레지스터에 0xB800 복사
mov ds, ax ; DS 세그먼트 레지스터에 AX 레지스터의 값(0xB800)을 복사
mov byte[0x00], 'M' ; DS 세그먼트:오프셋 0xB800:0x0000에 'M'을 복사
mov byte[0x01], 0x4A ; DS 세그먼트:오프셋 0xB800:0x0001에 0x4A(빨간 배경에 밝은 녹색 속성)를 복사
jmp $ ; 현재 위치에서 무한 루프 수행
times 510 - ($ - $$) db 0x00 ; $: 현재 라인의 어드레스
; $$: 현재 섹션(.text)의 시작 어드레스
; $ - $$: 현재 섹션을 기준으로 하는 오프셋
; 510 - ($ - $$): 현재부터 어드레스 510까지
; db 0x00: 1바이트를 선언하고 값은 0x00
; times: 반복 수행
; 현재 위치에서 어드레스 510까지 0x00으로 채움
db 0x55 ; 1바이트를 선언하고 값은 0x55
db 0xAA ; 1바이트를 선언하고 값은 0xAA
; 어드레스 511, 512에 0x55, 0xAA를 써서 부트 섹터로 표기함
실행 결과
세그먼트 레지스터 초기화와 Hello, World~!
최종 부트 로더 소스 코드(BootLoader.asm)
[ORG 0x00]
[BITS 16]
SECTION .text
jmp 0x07C0:START
START:
mov ax, 0x07C0
mov ds, ax
mov ax, 0xB800
mov es, ax
mov si, 0
.SCREENCLEARLOOP:
mov byte [ es:si ], 0
mov byte [ es:si + 1 ], 0x0A
add si, 2
cmp si, 80 * 25 * 2
jl .SCREENCLEARLOOP
mov si, 0
mov di, 0
.MESSAGELOOP:
mov cl, byte [ si + MESSAGE1 ]
cmp cl, 0
je .MESSAGEEND
mov byte [ es:di ], cl
add si, 1
add di, 2
jmp .MESSAGELOOP
.MESSAGEEND:
jmp $
MESSAGE1: db 'MINT64 OS Boot Loader Start~!!', 0
times 510 - ($ - $$) db 0x00
db 0x55
db 0xAA
실행 결과