alright I am trying to develop an operating system with assembly. I have written the boot loader and the beginnings of a kernel-however I am having a problem printing characters to the screen.
Here is my bootloader
use16 ; We need 16-bit intructions for Real mode ORG 0x7C00 ; The BIOS loads the boot sector into memory location 0x7C00 reset_drive: mov ah, 0 int 13h or ah, ah jnz reset_drive mov ax,0 mov es,ax mov bx,0x1000 mov ah,02h mov al,02h mov ch,0 mov cl,02h mov dh,0 int 13h or ah,ah jnz reset_drive cli ; Disable interrupts, we want to be alone xor ax, ax mov ds, ax ; Set DS-register to 0 - used by lgdt lgdt [gdt_desc] ; Load the GDT descriptor mov eax, cr0 ; Copy the contents of CR0 into EAX or eax, 1 ; Set bit 0 mov cr0, eax ; Copy the contents of EAX into CR0 jmp 08h:clear_pipe ; Jump to code segment, offset clear_pipe use32 ; We now need 32-bit instructions clear_pipe: mov ax, 10h ; Save data segment identifyer mov ds, ax ; Move a valid data segment into the data segment register mov ss, ax ; Move a valid data segment into the stack segment register mov esp, 090000h ; Move the stack pointer to 090000h mov esi,words xor edx,edx loop0: ;put message to screen mov word cx,[esi] mov word [ds:0B8000h+1920d+edx],cx ; M inc edx inc esi cmp byte [esi],0 jnz loop0 ;mov byte [ds:0B8001h], 1Bh ; Assign a color code jmp 01000h gdt: ; Address for the GDT gdt_null: ; Null Segment dd 0 dd 0 gdt_code: ; Code segment, read/execute, nonconforming dw 0FFFFh dw 0 db 0 db 10011010b db 11001111b db 0 gdt_data: ; Data segment, read/write, expand down dw 0FFFFh dw 0 db 0 db 10010010b db 11001111b db 0 gdt_end: ; Used to calculate the size of the GDT gdt_desc: ; The GDT descriptor dw gdt_end - gdt - 1 ; Limit (size) dd gdt ; Address of the GDT words db 't h i s i s a f u n c t i o n a l b o o t l o a d e r ',0000 times 510-($-$$) db 0 ; Fill up the file with zeros dw 0AA55h ; Boot sector identifyer ;credit for tutorial which helped me make this goes to Greg Brunmar and his "The Booting Process"
now when this loads it has no problem putting the text "This is a functional bootloader" to the screen with background color green. However, when it loads the kernel(at 01000h) it will not print sample text to the screen
org 0x1000 mov eax,0B8000h mov dword [eax],'PPPP' ;print 'PP' with background dark purple hang: jmp hang
when i debug the output it shows that it is correctly loading and running, but PP is not printed to the screen. Also, eax gets set to FFFFFFFFh, not the video memory offset. Is this because this being loaded into protected mode disallows access to the bios video memory? Then why doesn't the bootloader code have the same restriction because it is loaded into the same code segment? Also, in the bootloader, changing jmp 08h:clear_pipe to just jmp clear_pipe allows the kernel code to write to the screen, but not the bootloader code(it shows PP but not 'this is a functional bootloader')