FreeBASIC

Aus Lowlevel
Wechseln zu: Navigation, Suche
Allgemeines
Name: FreeBasic
Inlineassembler: Ja (Intel-Syntax)
Compiler: FBC (arbeitet mit GCC zusammen)
Spracheneigenschaften
Plattformen: Windows, Linux, u.a.
Beispielkernel in der Sprache: s.u.
Homepage
www.freebasic.net

Ob man BASIC für einen Kernel benutzen kann, ist in erster Linie eine akademische Frage. Der typische BASIC-Programmierer hat nicht die Kenntnisse, ein OS zu schreiben, und die Fortgeschritteneren wollen mit BASIC in aller Regel nichts zu tun haben.

Der Vollständigkeit halber: Es geht. Ich habe dazu FreeBASIC als Compiler benutzt.

Testkernel in BASIC

DIM video AS BYTE POINTER
DIM hello AS BYTE POINTER
 
video = CAST(BYTE POINTER, &Hb8000)
 
hello = strptr("Hello world")
 
WHILE *hello <> 0
    *video = *hello
    hello = hello + 1
    video = video + 2
WEND
 
DO : LOOP
 
CONST mb_magic = &H1BADB002
CONST mb_flags = 3
 
ASM
.global _start
_start:
    call fb_ctor__kernel
    jmp $
 
fb_RtInit:
    ret
 
mb_header:
    .align 4
    .int mb_magic
    .int mb_flags
    .int -mb_magic-mb_flags
END ASM

Gebaut wird das ganze mit den folgenden Befehlen:

fbc -c kernel.bas
ld -Ttext=0x100000 kernel.o -melf_i386 -o basic.krn

Anfang einer kleinen RTLib

Möchte man FB-Funktionen wie IN oder OUT benutzen, muss erstmal eine Runtime-Lib her, die die Funktionen zur Verfügung stellt. Die ist normalerweise in C geschrieben, aber das geht (zumindest für einfache Dinge) auch in FREEBASIC. Hier Beispiele für IN und OUT:

 
SUB fb_Out CDECL ALIAS "fb_Out" (port as USHORT, value as UBYTE)
    ASM
        movw dx, [port]
        movb al, [value]
        outb dx, al
    END ASM
END SUB
 
FUNCTION fb_In CDECL ALIAS "fb_In" (port as USHORT) AS UBYTE
    DIM value AS UBYTE
 
    ASM
       movw dx, [port]
       inb al, dx
       mov [value], al
    END ASM
 
    RETURN value
END FUNCTION
 

Diese werden in die Datei rtlib.bas gepackt, danach wie oben angegeben kompiliert. Zum Linken muss jetzt der folgende Befehl benutzt werden:

ld -Ttext=0x100000 kernel.o rtlib.o -melf_i386 -o basic.krn

Weblinks

Meine Werkzeuge
In anderen Sprachen