Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - ness

Seiten: [1]
1
Lowlevel-Coding / Stringausgabe scheitert
« am: 16. April 2005, 16:46 »
Deshalb hab ich ja auch garnix dran geändert. Das hier soll (irgendwann) mal der Kernel werden.
2
Lowlevel-Coding / Stringausgabe scheitert
« am: 15. April 2005, 21:22 »
Jetzt will ich mich mal rechtfertigen:
Ich benutze gcc, weil:
-er die option -c unterstützt (will nicht erst nachschauen wie das bei gas heißt)
-ich will später auch c/c++ (in wirklichkeit ist das ganze kompilieren ein script)
ich verwende gas, weil nasm keinen 64Bit code produzieren kann (jedenfalls hab ich ihn noch nicht dazu überreden können...)
Und, nein, die Reihenfolge ist richtig, das macht der switch.
Das komische:
wenn ich die biosfunktionen in kernel.s hau und daraus gleich eine binärdatei erstell (das also nicht erst durch den linker jage), gehts.
3
Lowlevel-Coding / Stringausgabe scheitert
« am: 14. April 2005, 21:06 »
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
Seiten: [1]

Einloggen