Pascal

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

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.

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

Die Zeile screen^[1, 1].attr := $07; definiert die Zeichenfarbe, in diesem Fall Grau auf Schwarz. Wollen wir jetzt aber z.B. einen Bluescreen-Zeichenhintergrund haben müssten wir screen^[1, 1].attr := $1F; nehmen. Für weitere Farben siehe Textausgabe.

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
 
type hresult = longint;
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 KERNEL_PASCALMAIN
global _start
 
section .text
_start:
 
    ; Stack initalisieren
    mov esp, kernelstack
 
    call KERNEL_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:

Jetzt sind nur noch 2 leere Units nötig damit der Kernel läuft.

si_prc.pas:

 
unit si_prc;
 
interface
 
implementation
 
end.
 

fpintres.pas:

 
unit fpintres;
 
interface
 
implementation
 
end.
 

Anschließend müssen diese fünf 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

Wer jetzt neugierig ist was der Kernel alles so auf dem Bildschirm bringt, kann den Kernel nach dem linken sofort mit QEMU ausführen:

qemu -kernel kernel

Weblinks

Meine Werkzeuge
In anderen Sprachen