Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [BITS 16]
- [ORG 0x7c00] ;; адрес загрузки ОС из BIOS, по соглашению
- _start:
- cli
- mov ax, cs
- mov ds, ax
- mov ss, ax
- mov sp, _start
- ;; Загрузка регистра GDTR:
- lgdt [gd_reg]
- ;; Включение A20:
- in al, 0x92 ; читаем из чипсета его конфигурацию
- or al, 2 ; меняем один бит
- out 0x92, al ; записываем обратно
- ;; Установка бита PE регистра CR0 (включение системы защиты)
- mov eax, cr0
- or al, 1
- mov cr0, eax
- ;; С помощью длинного прыжка мы загружаем
- ;; селектор нужного сегмента в регистр CS
- ;; (напрямую это сделать нельзя)
- ;; 8 (1000b) - первый дескриптор в GDT, RPL=0
- jmp 0x8: _protected ; то есть jmp записывает регистр CS, 8 - смещение в таблице GDT!!!!
- ; компилятор подставит адрес _protected
- [BITS 32]
- _protected:
- ;; Загрузим регистры DS и SS селектором
- ;; сегмента данных
- mov ax, 0x10 ; дескриптор сегмента данных (смещение в таблице дескрипторов)
- mov ds, ax
- mov ss, ax
- ;; MEMCHECK
- %define MEM_START 0x100000
- %define MEM_END 0x2000000
- %define PARTICLE 0x2000000
- mov ecx, MEM_START
- mov al, 0x42
- .writing:
- mov [ecx], al ; заносим al по АДРЕСУ ecx
- inc ecx
- mov edx, ecx
- and edx, 0xFFFFF ; отрезаем мегабайты
- cmp edx, 0
- jne .checkw
- mov bl, 00011010b
- mov esi, msg_mb_write
- call kputs
- .checkw
- cmp ecx, MEM_END
- jl .writing
- mov ecx, PARTICLE
- xor dl, dl
- mov [ecx], dl
- ; mov esi, msg_n
- ; call kputs
- mov ecx, MEM_START
- mov al, 0x42
- .reading:
- mov bl, [ecx]
- cmp al, bl
- jne .memory_bad
- inc ecx
- mov edx, ecx
- and edx, 0xFFFFF ; отрезаем мегабайты
- mov bl, 00011001b
- mov esi, msg_mb_read
- cmp edx, 0
- jne .checkr
- call kputs
- .checkr:
- cmp ecx, MEM_END
- jl .reading
- ; mov esi, msg_n
- ; call kputs
- mov esi, msg_good
- mov bl, 00001010b
- call kputs
- jmp end
- .memory_bad:
- mov esi, msg_bad
- mov bl, 00001100b
- call kputs
- jmp end
- end:
- ;; Завесим процессор
- hlt
- jmp short $
- cursor: dd 0
- %define VIDEO_RAM 0xB8000
- ;; Функция выполняет прямой вывод в память видеоадаптера
- ;; которая находится в VGA-картах (и не только) по адресу 0xB8000
- kputs:
- pusha
- .loop:
- lodsb
- test al, al
- jz .quit
- mov ecx, [cursor]
- mov [VIDEO_RAM+ecx*2], al
- mov al, bl ; M,RGB:Я,RGB
- mov [VIDEO_RAM+ecx*2+1], al
- inc dword [cursor]
- jmp short .loop
- .quit:
- popa
- ret
- gdt:
- dw 0, 0, 0, 0 ; Нулевой дескриптор
- db 0xFF ; Сегмент кода с DPL=0
- db 0xFF ; Базой=0 и Лимитом=4 Гб
- db 0x00
- db 0x00
- db 0x00
- db 10011010b ; есть право на исполнение
- db 0xCF
- db 0x00
- db 0xFF ; Сегмент данных с DPL=0
- db 0xFF ; Базой=0 и Лимитом=4Гб
- db 0x00
- db 0x00
- db 0x00
- db 10010010b
- db 0xCF
- db 0x00
- ;; Значение, которое мы загрузим в GDTR:
- gd_reg:
- dw 8192
- dd gdt
- msg_n: db "\n", 0
- msg_good: db "Memory GOOD",0
- msg_bad: db "Memory BAD", 0
- msg_mb_write: db "w", 0
- msg_mb_read: db "r", 0
- times 510-($-$$) db 0
- db 0xaa, 0x55
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement