Autor Thema: 16 bit Betriebssystem mit bcc als C Compiler  (Gelesen 8911 mal)

vinz

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« am: 22. January 2013, 16:46 »
Hallo Leute,
ich beschäftige mich gerade mit 16 bit Betriebssystemen. Auf Grundlage der Ausgabe 1 (http://www.lowlevel.eu/wiki/Ausgabe_1) hab ich selbst angefangen ein schlichtes OS mit nasm zu schreiben. Die gesamte api in Assemblern zu schreiben ist natürlich sehr zeitaufwändig und fehleranfällig, deswegen hab' ich mich nach einem C Compiler für den 8086 umgesehen und bin da auf bcc gestoßen. Das Problem ist jetzt nur, dass ich für bcc nicht gerade eine umfangreiche Dokumentation gefunden habe. Link dazu: http://manpages.ubuntu.com/manpages/precise/en/man1/bcc.1.html
Das ist auch schon das Problem, ich will einfach meinen Kernel von meinen Bootloader aufrufen. Dafür muss der Kernel natürlich als standalone compiliert sein und ich habe (fast) kein Plan wie ich den Compiler benutzen soll, da er so dürftig Dokumentiert ist. Das zweite Problem ist, das ich auch keinen blassen Schimmer habe, wie der inline-Assembler funktioniert... Kann natürlich auch sein, dass mein Ich-google-mal-alles-skill einfach total schlecht ist  :-D

Ich bin natürlich auch für andere 16 bit C Compiler offen, wenn es da welche für Ubuntu 12.04 gibt.

So weit bin ich bis jetzt:
asm "jmp _kmain";

void kputs(char *s)
{
    while (*s) {
        asm "mov ah, 0x0E";
        asm "mov si, _s";
        asm "mov al, [si]";
        asm "mov bx, 0x0007";
        asm "int 0x10";
        s++;
    }
}

void kmain()
{
    kputs("Test.");
    asm "cli";
    asm "hlt";
}

Compilieren verläuft wie folgend:
$ bcc -Ms kernel.c
kernel.c:8.15: error: need ')'
kernel.c:8.15: error: kputs already declared
kernel.c:8.19: error: s not in argument list
kernel.c:8.19: error: need ';'
kernel.c:8.19: error: need '{'
kernel.c:8.19: error: bad expression
kernel.c:9.1: error: need ';'
kernel.c:eof: error: need '}'

Gruß vinz
« Letzte Änderung: 22. January 2013, 16:48 von vinz »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 22. January 2013, 16:53 »
Urgs, ich hab das grad probiert und es sieht so aus als ob dieser bcc nicht mal C89 könnte. Versuch es mal so:
void kputs(s)
    char* s;
{
    ...
}

Wenn das mit einem Compiler allerdings schon so losgeht, frage ich mich ernsthaft, ob man nicht lieber nach was ganz anderem suchen sollte. SeaBIOS kriegt 16 Bit auch irgendwie mit gcc hin, vielleicht willst du dir das mal anschauen.

Und dann lass mich noch die offensichtliche und unvermeidbare Frage stellen: Warum in aller Welt willst du ein 16-Bit-OS schreiben? ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 22. January 2013, 18:05 »
Wenn du als Parameter ein "-ansi" hinzufügst, akzeptiert er auch deinen Code.

MasterLee

  • Beiträge: 49
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 22. January 2013, 18:13 »
Alternativ könnte man auch Turbo C 2.01 nehmen
http://cc.embarcadero.com/item/25636

vinz

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 22. January 2013, 20:41 »
Danke für die Antworten, dass ich entweder K&R C odere Ansi C benutzen muss ich ist mir jetzt auch klar.
Was immer noch nicht funktioniert ist, ist das richtige Dateien Format. Da ich jetzt schon fast alles ausprobiert habe, werde ich wohl wieder zum guten alten Assembler übergehen :wink: Der Compiler ist wohl eher ungeeignet... Einen Compiler über einen Emulator laufen zu lassen ist auch nicht die richtige Lösung.
Warum ich mir ein Betriebssystem in 16 bit schreiben will? Nostalgie oder einfach nur Spaß an der Sache (solange es funktioniert natürlich)

Gruß vinz

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 22. January 2013, 21:03 »
Hallo,

Was immer noch nicht funktioniert ist, ist das richtige Dateien Format.
Lass dich doch bei ELKS bzw. Linux-86 inspirieren. Der Compiler spuckt das Format aus, dann kannst du es auch benutzen.

Warum ich mir ein Betriebssystem in 16 bit schreiben will? Nostalgie oder einfach nur Spaß an der Sache (solange es funktioniert natürlich)
Besitzt du einen Computer, der die passende Architektur hat? Wenn du nur mit Nachfolgern testest, merkst du ungültige Befehle nicht. Zumindest ich kenne keinen Emulator, der wirklich nur einen PC-kompatiblen 8088/8086/80286 emuliert, von MAME/MESS mal abgesehen.

Wenn es ein 8- oder 16-Bit-System werden soll, dann nimm lieber eine Architektur, die man zuverlässig emulieren kann (oder einen halbwegs modernen Mikrocontroller, der Code aus RAM ausführen kann).

Gruß,
Svenska

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 22. January 2013, 21:27 »
Alternativ könnte man auch Turbo C 2.01 nehmen
http://cc.embarcadero.com/item/25636
Kann man damit auch problemlos flache Binaries bauen oder muss man sich da irgendwelche EXEn  auseinandernehmen? Wenn ersteres, ist das vermutlich das beste. Eine DOS-VM, Turbo C drauf und gut. Wenn schon Nostalgie, dann muss Borland sowieso dabei sein.

Warum ich mir ein Betriebssystem in 16 bit schreiben will? Nostalgie oder einfach nur Spaß an der Sache (solange es funktioniert natürlich)
Na gut, "weil ich kann" muss ich wohl aus Prinzip gelten lassen. ;)

Besitzt du einen Computer, der die passende Architektur hat? Wenn du nur mit Nachfolgern testest, merkst du ungültige Befehle nicht. Zumindest ich kenne keinen Emulator, der wirklich nur einen PC-kompatiblen 8088/8086/80286 emuliert, von MAME/MESS mal abgesehen.
MyEmu ist nie so weit gekommen, dass es ein vollständiger 8086 gewesen wäre, oder?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

MasterLee

  • Beiträge: 49
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 24. January 2013, 17:52 »
Alternativ könnte man auch Turbo C 2.01 nehmen
http://cc.embarcadero.com/item/25636
Kann man damit auch problemlos flache Binaries bauen oder muss man sich da irgendwelche EXEn  auseinandernehmen?
Ich hab jetzt mal einfach Borland C++ 4.5 für Win 3.1(weil ich es mal für 800DM gekauft hatte) genommen da steht in der Hilfe als Speichermodell Tiny wählen und beim linker /t angeben.

 

Einloggen