Pascal

Aus Lowlevel

Wechseln zu: Navigation, Suche
Allgemeines
Name: (Turbo/Object)Pascal
Inlineassembler: Ja (Intel-Syntax)
Compiler: FreePascal, Borland Delphi
Spracheneigenschaften
Plattformen: Windows (Hier vor allem Delphi), Linux, u.a.
Beispielkernel in der Sprache: s.u.
Homepage
www.freepascal.net

Pascal ist eine strukturierte, prozedurale, objektorientierte, nach Blaise Pascal benannte, und von Nikolaus Wirth im Jahre 1972 als Lehrsprache konzipierte Programmiersprache. Sie ist ähnlich mächtig wie C und wurde im Laufe der Jahre durch verschiedene Sprachkonstrukte erweitert und weiterentwickelt (Borlands Delphi, ObjectPascal).

Pascal in der Betriebssystementwicklung

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