![]() |
|
![]() |
Aufgabe im Bereich Maschinennahe Programmierung ist die Entwicklung
einer in 80x86-Assembler geschriebenen Routine, die unter Verwendung des
80x87-Coprozessors numerische Berechnungen mit reellen Zahlen durchführt.
Dabei ist die Assembler-Routine von einem vorgegebenen, in C geschriebenen
Rahmenprogramm aus aufzurufen.
Zum Austesten der Routine müssen das C-Programm compiliert, die
zu entwickelnde Routine assembliert und die daraus entstandenen beiden
Object-Dateien zusammengebunden werden.
Die Entwicklungsumgebung kann frei zwischen DOS oder LINUX gewählt werden.
Hierzu sind folgende Werkzeuge zu verwenden:
| DOS | LINUX | |
| Compiler | djgpp GNU C (gcc) für DOS | GNU C (gcc) |
| Assembler | nasm32 für DOS | nasm für LINUX (für libc5 oder libc6) |
| Linker | djgpp Linker für DOS | Standard LINUX Linker |
DOS:
Da DOS standardmäßig kein 32-Bit Speichermodell unterstützt
und es bei Verwendung von 16 Bit C-Compilern in Verbindung mit NASM häufig
Probleme mit dem Linken gibt, ist das frei verfügbare Paket DJGPP
zu installieren. Dieses beinhaltet eine komplette 32-Bit Entwicklungsumgebung
für DOS einschließlich Compiler, Linker und Debugger. Das ZIP-File
ist in ein geeignetes Verzeichnis (z.B. c:\djgpp) zu entpacken. Weiterhin
sind die entprechenden Umgebungsvariablen in c:\autoexec.bat zu setzen:
set DJGPP=c:\djgpp\djgpp.env
set PATH=c:\djgpp\bin;%PATH%
Dann ist das System neu zu starten. Nach dem Neustart ist folgender Befehl aufzurufen:
go32-v2
Es sollte eine Meldung über den verfügbaren Speicherplatz
ausgegeben werden.
Das DJGPP-Paket ist jetzt verwendbar.
Die Homepage für DJGPP findet sich hier.
LINUX:
Mit Ausnahme des Assemblers nasm sind die erforderlichen Werkzeuge
unter LINUX bereits vorhanden. Je nachdem, welche libc-Version die LINUX-Version
verwendet, muß das entsprechende rpm-Paket (für libc5
oder libc6) mittels
rpm -i <Paketname>
unter root-Rechten installiert werden.
Compilieren und Linken (DOS und LINUX):
Das Erzeugen des ausführbaren Programms erfolgt am besten mit
Hilfe des von UNIX her bekannten Befehls make, der ebenfalls Teil
der DJGPP-Distribution ist. Hierzu wird allerdings eine Steuerdatei, das
sogenannte Makefile, benötigt, in dem angegeben ist, welche Quelldateien
zu verarbeiten sind. Im folgenden ist als Beispiel ein Makefile zur Erzeugung
eines Programms calctest (LINUX) bzw. calctest.exe (DOS). Die entsprechende
Datei ist unter dem Namen Makefile abzuspeichern. Das C-Programm befinde
sich in read.c, die Assembler-Routine in calc.asm.
CFLAGS= -g
all:
nasm -f <Ausgabeformat>
calc.asm
gcc -c -g readbla.c
gcc -o calctest calc.o readbla.o
-lm
Achtung: bei eingerückten Zeilen ist im Makefile TAB zu verwenden!
Zu beachten ist außerdem noch das Ausgabeformat für nasm:
Unter DOS muß hier coff verwendet werden, unter LINUX elf
oder
aout.
Debugging (DOS):
Im DJGPP-Paket sind mehrere Debugger enthalten. Zum einen lassen sich
mit der Benutzeroberfläche RHIDE, die der von Borland bekannten Turbo-C
bzw. Turbo-Pascal Oberfläche nachempfunden ist, Debug-Operationen
durchführen
(Aufruf: rhide <Programmname>).
Optional kann man auch den Debugger rhgdb direkt verwenden
(Aufruf: rhgdb <Programmname>).
Eine kommandozeilenorientierte Version von gdb steht ebenfalls zur Verfügung
(Aufruf: gdb <Programmname>).
Darüber hinaus bietet der Debugger fsdb die Möglichkeit, die
Register der 80x87 Coprozessoreinheit zu untersuchen
(Aufruf: fsdb <Programmname>, Hilfe mit F1).
Debugging (LINUX):
Unter LINUX kann der Debugger gdb,
und die darauf aufsetzenden grafischen Versionen xxgdb,
mxgdb, kdbg, ddd etc. verwendet
werden. Eine Liste verschiedener Debugger findet sich hier.
Weitere Links