Autor Thema: Stringausgabe scheitert  (Gelesen 3706 mal)

ness

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« 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

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #1 am: 15. April 2005, 15:00 »
also gas ist eigentlich für AT&T-Syntax gedacht, du hast zwar am Anfang nen switch dafür, aber es wäre besser gleich nasm(o.ä.) zu nehmen wenn du Intel-Syntax willst.
Abgesehen davon, wenn du eh nur Asm benutzt soweit, warum dann gcc??? das ist ein C-Compiler der mit asm an sich garnix anzufangen weiß. Der gibts nur an gas weiter
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 15. April 2005, 15:31 »
gas hat doch erst quelle dann das ziel, ich denke das stimmt nicht bei deinem Code.

ness

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #3 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.

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #4 am: 16. April 2005, 15:09 »
im bootloader ist 64bit code bisl sinnlos
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

ness

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 16. April 2005, 16:46 »
Deshalb hab ich ja auch garnix dran geändert. Das hier soll (irgendwann) mal der Kernel werden.

 

Einloggen