Pascal

Aus Lowlevel

Wechseln zu: Navigation, Suche

Anders als oft behauptet, ist Pascal eine Programmiersprache, die durchaus auch für die Lowlevel-Entwicklung geeignet ist. Allerdings stehen die Funktionen der Standardbibliothek nicht zur Verfügung. Als Daumenregel kann man festhalten, dass Pascal in diesem Zustand ähnlich mächtig wie C ist.

Beispielkernel in Pascal

Zunächst kernel.pas - der eigentliche Kernel, der ein Zeichen ausgibt.

program kernel;
 
type tScreen = array[1..25, 1..80] of record
    c: char;
    attr: byte;
end;
 
var
    screen: ^tScreen;
begin
    screen := Pointer($B8000);
    screen^[1, 1].c := '#';
end.

Das war der einfache Teil. Als nächstes brauchen wir eine eigene system-Unit, die allerdings für den Anfang nur zwei Stubs bereitstellen muss. system.pas:

unit system;
 
interface
 
procedure FPC_INITIALIZEUNITS; compilerproc;
procedure FPC_DO_EXIT; compilerproc;
 
implementation
 
procedure FPC_INITIALIZEUNITS; alias: 'FPC_INITIALIZEUNITS'; compilerproc;
begin
end;
 
procedure FPC_DO_EXIT; alias: 'FPC_DO_EXIT'; compilerproc;
begin
end;
 
end.

Und der dritte Teil ist ein Assembler-Stub, prt0.asm:

extern PASCALMAIN
global _start
 
section .text
_start:
 
    ; Stack initalisieren
    mov esp, kernelstack
 
    call PASCALMAIN
    jmp $
 
multiboot_header:
align 4
  MULTIBOOT_MAGIC     equ 0x1BADB002
  MULTIBOOT_FLAGS     equ 0x03
  MULTIBOOT_CHECKSUM  equ -MULTIBOOT_MAGIC-MULTIBOOT_FLAGS
 
  dd MULTIBOOT_MAGIC
  dd MULTIBOOT_FLAGS
  dd MULTIBOOT_CHECKSUM
 
section .bss
  resb  16384
kernelstack:

Anschließend müssen diese drei Dateien kompiliert/assembliert und gelinkt werden. Das ist der Punkt, der mir noch nicht so ganz gefällt, weil ich ld eigentlich nicht von Hand aufrufen müssen will, um text=0x100000 setzen zu können.

nasm -felf prt0.asm
fpc kernel
ld -Ttext=0x100000 *.o -o kernel

Weblinks

Persönliche Werkzeuge