내 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
  • 실행 결과

results matching ""

    No results matching ""