Search

가상 OS asm

대분류
CS
소분류
OS
유형
C
Linux
최종 편집 일시
2024/10/29 04:34
생성 일시
2022/04/07 08:19
15 more properties

섹터

[ORG 0x00] ; 코드의 시작 주소를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16bit 코드로 설정 SECTION .text ; text 섹션(세그먼트) jmp 0x1000:START ; CS 세그먼트 레지스터에 0x1000을 복사하면서, START 레이블로 이동 SECTORCOUNT: dw 0x0000 ; 현재 실행 중인 섹터 번호를 저장 TOTALSECTORCOUNT equ 1024 ; 가상 OS의 총 섹터 수 ; 최대 1152섹터(090000byte)까지 가능 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
복사