Печать символов на экране ASM в защищенном режиме
Я пытаюсь войти в защищенный режим и затем распечатать "Привет"
Но вместо этого он просто печатает "Загрузка ОС" из моего вызова прерывания BIOS (который произошел до ввода pmode) И ничего больше.
Мой Bootloader.asm
%DEFINE KERNEL_LOAD_OFFSET 0x1000
org 0x7c00
bits 16
xor ax, ax
mov ds, ax
start: jmp main
Print:
.print:
lodsb
or al, al
je .done
mov ah, 0x0E
int 0x10
.repeat:
jmp .print
.done:
ret
ResetFloppy:
mov ah, 0x0
int 0x13
jc ErrorFloppy
.done:
ret
ReadFloppy:
mov ah, 0x02
int 0x13
jc ErrorFloppy
.done:
ret
ErrorFloppy:
mov si, msgErrorFloppy
call Print
jmp hang
main:
.print:
mov si, msg
call Print
.loadFile:
mov al, 0xF
mov ch, 0x0
mov cl, 0x02
mov dh, 0x0
mov dl, 0x0
mov bx, KERNEL_LOAD_OFFSET
call ResetFloppy
call ReadFloppy
.loadGDT:
lgdt [gdtr]
.pM_start:
cli
pusha
mov eax, cr0
or al, 1
mov cr0, eax
popa
jmp 0x08:ljmp_pM
bits 32
ljmp_pM:
mov ax, 0x10
mov ds, ax
mov ss, ax
mov fs, ax
mov es, ax
mov gs, ax
jmp KERNEL_LOAD_OFFSET
hang:
jmp $
gdt:
NULL_DESC:
dd 0 ; null descriptor
dd 0
CODE_DESC:
dw 0xFFFF ; limit low
dw 0 ; base low
db 0 ; base middle
db 10011010b ; access
db 11001111b ; granularity
db 0 ; base high
DATA_DESC:
dw 0xFFFF ; data descriptor
dw 0 ; limit low
db 0 ; base low
db 10010010b ; access
db 11001111b ; granularity
db 0 ; base high
gdtr:
Limit dw 24 ; length of GDT
Base dd NULL_DESC ; base of GDT
msg db "Loading OS", 13, 10, 0
msgErrorFloppy db "There was an error with the floppy", 13, 10, 0
FILL:
times 510-($-$$) db 0
BOOTSECTOR:
dw 0xAA55
Kernel.asm
bits 32
mov dword [0xB8000], 0x07690748
jmp $
И Compile.bat
nasm -f bin Dev/BootLoader.asm -o Bin/BootLoader.bin
nasm -f bin Dev/Kernel.asm -o Bin/Kernel.bin
dd if=Bin/BootLoader.bin of=Image/Image.img seek=0
dd if=Bin/Kernel.bin of=Image/Image.img seek=1 conv=notrunc
pause
Я использую bochs. И все, что я получаю, это: http://prntscr.com/d24wmm
1 ответ
В 32-битном защищенном режиме вы не можете использовать BIOS, потому что он написан в 16-битном коде реального режима. Итак, вы должны получить доступ к видеопамяти следующим образом:
mov ebx,0xb8000 ; The video address
mov al,'!' ; The character to be print
mov ah,0x0F ; The color: white(F) on black(0)
mov [ebx],ax ; Put the character into the video memory
Тогда вы можете увидеть !
в начале экрана. Если вы хотите просто печатать в позиции курсора, вы можете получить смещение курсора следующим образом:
mov dx,0x3D4 ; Tell the control I/O port to get the lower byte of
mov al,0x0F ; the cursor offset
out dx,al
mov dx,0x3D5 ; Switch to data I/O port
in al,dx ; Get the cursor offset's lower byte
mov dx,0x3D5 ; Tell the control I/O port to get the higher byte of
mov al,0x0E ; the cursor offset
out dx,al
mov dx,0x3D5 ; Switch to data I/O port
in al,dx ; Get the higher byte
imul ax,2 ; Because a character in video memory costs 2 bytes
; (i.e character and attribute), we need to twice the cursor offset
В 32-битном защищенном режиме, чтобы повысить эффективность вашего кода, вы можете использовать какой-нибудь язык высокого уровня, такой как
C
создавать функции. Это действительно повысило читабельность кода.