User:Imate900/32-bit assembler bare bones: Difference between revisions

From OSDev.wiki
Jump to navigation Jump to search
Content deleted Content added
m Bot: Replace deprecated source tag with syntaxhighlight
 
(10 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{Rating|2}}{{Template:Kernel designs}}
<!--{{Rating|2}}{{Template:Kernel designs}}-->


''This tutorial will teach you how to make a 32-bit assembler kernel.''
''This tutorial will teach you how to make a 32-bit Assembly kernel.''
== Preface ==
Most OSes are in C, but you may consider it in Assembly. This is moderate-easy, and requires knowing GRUB and Assembly.


== GRUB ==
== GRUB ==
All we need is something like this (nasm):
All we need is something like this (Nasm):
<syntaxhighlight lang="asm">
<pre>
%define MBOOT_MAGIC 0x1badb002
%define MBOOT_MAGIC 0x1badb002
%define MBOOT_FLAGS 0x00010002
%define MBOOT_FLAGS 0x00010002
Line 12: Line 14:
org 0x100000
org 0x100000


align 4, db 0
header:
dd MBOOT_MAGIC
dd MBOOT_FLAGS
dd 0 - MBOOT_MAGIC - MBOOT_FLAGS
dd header
dd __entry_point
dd end_of_file
dd end_of_file
dd __entry_point
align 0, db 0
__entry_point:
__entry_point:
mov edi, 0xB8000
mov edi, 0xB8000
Line 22: Line 35:
jnz .displaying
jnz .displaying
jmp short $
jmp short $

align 4, db 0
header:
dd MBOOT_MAGIC
dd MBOOT_FLAGS
dd 0 - MBOOT_MAGIC - MBOOT_FLAGS
dd header
dd __entry_point
dd end_of_file
dd end_of_file
dd __entry_point

string: db "Hello world!", 0
string: db "Hello world!", 0


align 4, db 0
align 4, db 0
end_of_file:
end_of_file:
</syntaxhighlight>
</pre>


Link with:
Link with:
<syntaxhighlight lang="bash">
nasm -f bin kernel.asm
nasm -f bin kernel.asm
</syntaxhighlight>


Make sure you have a GRUB entry...
Make sure you have a GRUB entry...
<pre>
title Assembler Barebones
title Assembler Barebones
kernel (hd0,0)/boot/kernel.bin
kernel (hd0,0)/boot/kernel.bin
</pre>


Now, reboot, and enjoy!
Now, reboot, and enjoy!
Line 51: Line 56:
== Without GRUB ==
== Without GRUB ==
If your bootloader loads flat binary images and gives you protected mode for you, use this code as a basis:
If your bootloader loads flat binary images and gives you protected mode for you, use this code as a basis:
<syntaxhighlight lang="asm">
<pre>
_start:
_start:
; Write kernel here. It might be good to load a new GDT.
; Write kernel here. It might be good to load a new GDT.
mov edi, 0xB8000
mov edi, 0xB8000
mov esi, string
mov esi, string
Line 63: Line 68:
jnz .displaying
jnz .displaying
jmp short $
jmp short $

</pre>
string: db "Hello world!", 0
</syntaxhighlight>
If you start out in real mode, remember to switch to [[Protected Mode]].
If you start out in real mode, remember to switch to [[Protected Mode]].


== Postface ==
{{In Progress}}
Good luck writing your 32-bit Assembly kernel! '''But''', there ''ARE'' catch-yas!
*As soon as possible, load a new GDT.
*You must not depend on the BIOS to do everything for you. Most prominent are disk access, printing to the screen (this tutorial has a way to printing: writing to 0xb8000) and reading keys from the keyboard. No BIOS ints will help and only cause a GPF.

Latest revision as of 06:16, 9 June 2024


This tutorial will teach you how to make a 32-bit Assembly kernel.

Preface

Most OSes are in C, but you may consider it in Assembly. This is moderate-easy, and requires knowing GRUB and Assembly.

GRUB

All we need is something like this (Nasm):

%define MBOOT_MAGIC 0x1badb002
%define MBOOT_FLAGS 0x00010002

bits 32
org 0x100000

align 4, db 0
header:
   dd MBOOT_MAGIC
   dd MBOOT_FLAGS
   dd 0 - MBOOT_MAGIC - MBOOT_FLAGS
   dd header
   dd __entry_point
   dd end_of_file
   dd end_of_file
   dd __entry_point
align 0, db 0
__entry_point:
   mov edi, 0xB8000
   mov esi, string
   mov ah, 0x0F
   .displaying:
   lodsb
   stosw
   or al, al
   jnz .displaying
   jmp short $
string: db "Hello world!", 0

align 4, db 0
end_of_file:

Link with:

nasm -f bin kernel.asm

Make sure you have a GRUB entry...

 title Assembler Barebones
 kernel (hd0,0)/boot/kernel.bin

Now, reboot, and enjoy!

Without GRUB

If your bootloader loads flat binary images and gives you protected mode for you, use this code as a basis:

_start:
; Write kernel here. It might be good to load a new GDT.
   mov edi, 0xB8000
   mov esi, string
   mov ah, 0x0F
   .displaying:
   lodsb
   stosw
   or al, al
   jnz .displaying
   jmp short $

string: db "Hello world!", 0

If you start out in real mode, remember to switch to Protected Mode.

Postface

Good luck writing your 32-bit Assembly kernel! But, there ARE catch-yas!

  • As soon as possible, load a new GDT.
  • You must not depend on the BIOS to do everything for you. Most prominent are disk access, printing to the screen (this tutorial has a way to printing: writing to 0xb8000) and reading keys from the keyboard. No BIOS ints will help and only cause a GPF.