160 lines
3.1 KiB
NASM
160 lines
3.1 KiB
NASM
|
.intel_syntax noprefix
|
|||
|
|
|||
|
.code16
|
|||
|
.global _start
|
|||
|
_start:
|
|||
|
xor ax, ax # Clear AX
|
|||
|
mov ds, ax # Set DS to 0
|
|||
|
mov es, ax # Set ES to 0
|
|||
|
mov ss, ax # Set SS to 0
|
|||
|
mov sp, 0x7C00 # Set stack pointer
|
|||
|
|
|||
|
mov ax, 0x1000 # Load the address where the disk is located
|
|||
|
mov es, ax # Set ES to point to this location
|
|||
|
mov bx, 0 # BX = 0
|
|||
|
mov ah, 2 # Read sectors function
|
|||
|
mov dl, 1 # Drive number (1 = first floppy)
|
|||
|
mov dh, 0 # Head number
|
|||
|
mov cl, 1 # Starting sector (1)
|
|||
|
mov ch, 0 # Cylinder number
|
|||
|
mov al, 88 # Number of sectors to read
|
|||
|
int 0x13 # BIOS interrupt to read sectors
|
|||
|
|
|||
|
mov ax, 0x0003
|
|||
|
int 0x10
|
|||
|
|
|||
|
LOAD:
|
|||
|
xor cx, cx
|
|||
|
xor dx, dx
|
|||
|
mov eax, 0xe801
|
|||
|
int 0x15
|
|||
|
mov [0x3400], cx # Количество Кб до 16 Мб
|
|||
|
mov [0x3420], dx # Количество страниц размером 64 Кб
|
|||
|
|
|||
|
LOADING_OS_PRINT:
|
|||
|
mov ah, 0x0e
|
|||
|
mov al, 'L'
|
|||
|
int 0x10
|
|||
|
mov al, 'o'
|
|||
|
int 0x10
|
|||
|
mov al, 'a'
|
|||
|
int 0x10
|
|||
|
mov al, 'd'
|
|||
|
int 0x10
|
|||
|
mov al, 'i'
|
|||
|
int 0x10
|
|||
|
mov al, 'n'
|
|||
|
int 0x10
|
|||
|
mov al, 'g'
|
|||
|
int 0x10
|
|||
|
mov al, ' '
|
|||
|
int 0x10
|
|||
|
mov al, 'O'
|
|||
|
int 0x10
|
|||
|
mov al, 'S'
|
|||
|
int 0x10
|
|||
|
mov al, '.'
|
|||
|
int 0x10
|
|||
|
mov al, '.'
|
|||
|
int 0x10
|
|||
|
mov al, '.'
|
|||
|
int 0x10
|
|||
|
mov al, ' '
|
|||
|
int 0x10
|
|||
|
mov al, 'P'
|
|||
|
int 0x10
|
|||
|
mov al, 'r'
|
|||
|
int 0x10
|
|||
|
mov al, 'e'
|
|||
|
int 0x10
|
|||
|
mov al, 's'
|
|||
|
int 0x10
|
|||
|
mov al, 's'
|
|||
|
int 0x10
|
|||
|
mov al, ' '
|
|||
|
int 0x10
|
|||
|
mov al, 's'
|
|||
|
int 0x10
|
|||
|
mov al, 'p'
|
|||
|
int 0x10
|
|||
|
mov al, 'a'
|
|||
|
int 0x10
|
|||
|
mov al, 'c'
|
|||
|
int 0x10
|
|||
|
mov al, 'e'
|
|||
|
int 0x10
|
|||
|
mov al, ' '
|
|||
|
int 0x10
|
|||
|
mov al, 't'
|
|||
|
int 0x10
|
|||
|
mov al, 'o'
|
|||
|
int 0x10
|
|||
|
mov al, ' '
|
|||
|
int 0x10
|
|||
|
mov al, 'c'
|
|||
|
int 0x10
|
|||
|
mov al, 'o'
|
|||
|
int 0x10
|
|||
|
mov al, 'n'
|
|||
|
int 0x10
|
|||
|
mov al, 't'
|
|||
|
int 0x10
|
|||
|
mov al, 'i'
|
|||
|
int 0x10
|
|||
|
mov al, 'n'
|
|||
|
int 0x10
|
|||
|
mov al, 'u'
|
|||
|
int 0x10
|
|||
|
mov al, 'e'
|
|||
|
int 0x10
|
|||
|
mov al, '!'
|
|||
|
int 0x10
|
|||
|
|
|||
|
input:
|
|||
|
mov ah, 0
|
|||
|
int 0x16
|
|||
|
cmp al, 0x20
|
|||
|
jne input
|
|||
|
mov ax, 0x03
|
|||
|
int 0x10
|
|||
|
|
|||
|
COMPLETE:
|
|||
|
mov ax, 0x3 # Read character from keyboard
|
|||
|
int 0x10 # BIOS interrupt for video services
|
|||
|
|
|||
|
lgdt gdt_info # Load GDT
|
|||
|
cli # Clear interrupts
|
|||
|
in al, 0x70 # Read from port 0x70
|
|||
|
or al, 0x80 # Set bit 7
|
|||
|
out 0x70, al # Write back to port 0x70
|
|||
|
|
|||
|
mov eax, cr0 # Read control register 0
|
|||
|
or al, 1 # Set PE bit to enter protected mode
|
|||
|
mov cr0, eax # Write back to CR0
|
|||
|
|
|||
|
jmp 0x8:protected_mode # Jump to protected mode
|
|||
|
|
|||
|
.code32
|
|||
|
protected_mode:
|
|||
|
mov ax, 0x10 # Load data segment selector
|
|||
|
mov es, ax # Set ES
|
|||
|
mov ds, ax # Set DS
|
|||
|
mov ss, ax # Set SS
|
|||
|
|
|||
|
call 0x10000 # Call code at new segment
|
|||
|
|
|||
|
inf_loop:
|
|||
|
jmp inf_loop # Infinite loop
|
|||
|
|
|||
|
gdt:
|
|||
|
.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|||
|
.byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x9A, 0xCF, 0x00
|
|||
|
.byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x92, 0xCF, 0x00
|
|||
|
gdt_info:
|
|||
|
.word gdt_info - gdt
|
|||
|
.word gdt, 0
|
|||
|
|
|||
|
# Reserve space to ensure we have a valid boot sector
|
|||
|
.zero (512 - ($ - _start) - 2)
|
|||
|
.byte 0x55, 0xAA
|