섹터
[ORG 0x00] ; 코드의 시작 주소를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16bit 코드로 설정
SECTION .text ; text 섹션(세그먼트)
jmp 0x1000:START ; CS 세그먼트 레지스터에 0x1000을 복사하면서, START 레이블로 이동
SECTORCOUNT: dw 0x0000 ; 현재 실행 중인 섹터 번호를 저장
TOTALSECTORCOUNT equ 1024 ; 가상 OS의 총 섹터 수
; 최대 1152섹터(0ㅌ90000byte)까지 가능
START:
mov ax, cs ; CS의 값을 AX에 설정
mov ds, ax ; AX의 값을 DS에 설정
mov ax, 0xB800 ;비디오 메모리 주소인 0xB800을 세그먼트 레지스터 값으로 변환
mov es, ax ; ES에 설정
;;;;;;;;;;;;;;;;;;;;;
; 각 섹터별로 코드를 생성 ;
;;;;;;;;;;;;;;;;;;;;;
%assign i 0 ; value i = 0; = i 변수 지정 후 0으로 초기화
%rep TOTALSECTORCOUNT ; TOTALSECTORCOUNT 만큼 반복
%assign i i + 1 ; i++;
; 현재 실행중인 코드가 포함된 섹터의 위치를 화면 좌표로 변환
mov ax, 2 ; 한문자를 나타내는 바이트 수(2)를 ax에 설정
mul word [ SECTORCOUNT ] ; ax와 섹터 수를 곱함
mov si, ax ; 곱한 결과를 si에 설정
; 계산된 결과를 비디오 메모리에 오프셋으로 삼아 세번째 라인부터 화면에 0을 출력
mov byte [ es : si + (160 * 2 ) ], '0' + ( i % 10 )
add word [ SECTORCOUNT ], 1 ; 섹터 수 1 증가
; if 마지막 섹터 일경우 무한루프 수행
; else 다음 섹터로 이동해서 코드 수행
%if i == TOTALSECTORCOUNT ; 마지막 섹터이면
jmp $ ; 현재위치에서 무한루프
%else ; 마지막 센터 아니면
jmp ( 0x1000 + i * 0x20 ): 0x0000 ; 다음 섹터 오프셋으로 이동
%endif ; if문의 끝
times (512 - ( $ - $$ ) % 512 ) db 0x00
%endrep ; 반복문 종료
C
복사
Kernel32/makefile
# 기본적으로 빌드를 수행할 목록
all: VirtualOS.bin
# 부트 로더의 기능을 테스트 하기 위한 가상의 OS 이미지 빌드
VirtualOS.bin: VirtualOS.asm
nasm -o VirtualOS.bin VirtualOS.asm
#소스 파일을 제외한 나머지 파일 정리
clean:
rm -f VirtualOS.bin
C
복사
root/makefile
all: BootLoader Kernel32 Disk.img
BootLoader:
@echo
@echo ============== Build Boot Loader ==============
@echo
make -C 00.BootLoader
@echo
@echo ============== Build Complete ==============
@echo
Kernel32:
@echo
@echo ============== Build 32Bit Kernel ==============
@echo
make -C 01.Kernel32
@echo
@echo ============== Build Complete ==============
@echo
Disk.img: 00.BootLoader/BootLoader.bin
@echo
@echo ============== Disk Image Build Start ==============
@echo
cp 00.BootLoader/BootLoader.bin 01.Kernel/VirtualOS.bin > Disk.img
@echo
@echo ============== All Build Complete ==============
@echo
clean:
make -C 00.BootLoader clean
make -C 01.Kernel32 clean
rm -f Disk.img
C
복사