Pascal

Aus Lowlevel
Version vom 30. Juli 2009, 00:49 Uhr von Hartmut (Diskussion | Beiträge) (Vorlage:Sprache und ein bisschen was zu Pascal (alles korrekt?))
Wechseln zu:Navigation,

Pascal ist eine strukturierte prozedurale und objektorientierte, nach Blaise Pascal 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).

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 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. <pascal>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.</pascal>

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: <pascal>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.</pascal>

Und der dritte Teil ist ein Assembler-Stub, prt0.asm: <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:</asm>

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