Ich versuche grad n bissel zu coden. Den bootloader hab ich einfach so übernommen, werd auch nix dran ändern. Aber mein Kern Funzt net. Benutze gas. kernel.s:.intel_syntax noprefix
.code16
# ---------------------------------------------------
# Unser Kernel
# ---------------------------------------------------
mov ax, 0x1000 # Segmentregister updaten
mov ds, ax
mov es, ax
start:
mov si, msg
call bios_print # Schicke Bootmessage :)
mov si,msg_boot
call bios_print # Noch eine Message :D
call bios_getkey # Warte auf einen Tastendruck
jmp reboot
# -------------------------------------------------
# Funktionen und Variablen
# -------------------------------------------------
msg: .string "Welcome to StupidOS 1.0\n"
msg_boot: .string "Press any key...\n"
# Rebooten (HEX Dump).
reboot:
.byte 0x0EA
.word 0x0000
.word 0x0FFFF
die:
jmp die
bios.s:.intel_syntax noprefix
.code16
.global bios_print
.global bios_getkey
# Warte auf einen Tastendruck
bios_getkey:
mov ah, 0 # Funktion 0
int 0x16 # Ausführen
ret
# Stringausgabe
bios_print:
lodsb # Byte laden
or al,al
jz bios_printd # 0-Byte? -> Ende!
mov ah,0x0E # Funktion 0x0E
mov bx,0x0007 # Atrribut-Byte
int 0x10 # schreiben
jmp bios_print # nächstes Byte
bios_printd:
ret
Ich kompiere das so:
gcc -ffreestanding -c *.s
dann linke ich:
ld -T link -o kernel.bin kernel.o bios.o
link:
OUTPUT_FORMAT("binary")
SECTIONS
{
.text : {
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(1);
}
.data : {
data = .; _data = .; __data = .;
*(.data)
. = ALIGN(1);
}
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(1);
}
end = .; _end = .; __end = .;
}
Zusammenfügen:
cat bootloader.bin kernel.bin > kernel.img
Das ganze starte ich dann in bochs. Aber die Meldungen werden nicht ausgegeben! Es scheint daran zu liegen, dass er sofort ein nullbyte sieht. Die einzige Fehlerquelle, die mur einfällt, sind falsche offsets. Aber selbst wenn ich msg+0x1000 schreibe, kommt nur ein komisches zeichen.
Überhaupt hätte ich mir (zumindest nach der Beschreibung in meiner ASM Referenz) den Befehl vor dem Ausgeben eher als
/edit:schwachfug, dabei gehts um offsets