Thiemo Mättig

Assembler-Beleg „Kugelschicht“

Bildschirmfoto des Assemblerprogramms

Belegarbeit von Thiemo Mättig, II99, Sommersemester 2000

Die Wahl einer mathematischen Aufgabe für diesen Beleg war keineswegs einfach. Einerseits durfte die Formel nicht zu leicht sein. Andererseits sollten möglichst keine Wurzeln oder ähnliche, in Assembler nur sehr aufwendig zu realisierende Funktionen auftauchen. Eine Wurzelfunktion wäre mit einer geschickten Näherungsrechnung noch machbar gewesen. Ein Sinus hätte jedoch schnell die engen Grenzen des Assemblers gesprengt.

Ich entschied mich schließlich für die Volumenberechnung einer Kugelschicht. Die Formel dazu lautet:

V = Pi * h / 6 * (3 * r1^2 + 3 * r2^2 + h^2)

Für den Assembler muss die Klammerung stark verändert werden. Vor allem die Division muss ganz an das Ende rücken, so dass mit dem dabei entstehenden Rest geschickt weiter gearbeitet werden kann. Auch die Zahl Pi muss durch eine sinnvolle Näherung ersetzt werden. Ich arbeite mit 22/7, was zusammen mit der Teilung durch 6 die ersichtlichen 11/21 ergibt. Leider ist diese Näherung nicht sonderlich genau. Aber da alle andere Brüche (z.B. 355/113, was auf sieben Stellen genau wäre) den intern verwendeten 32-Bit Wert sprengen würden, ist dies die beste Wahl. Somit ergibt sich folgende Formel, die ich auch genau so in meinem Programm realisieren konnte:

V = (((r1 * r1) + (r2 * r2)) * 3 + (h * h)) * (h * 11) / 21

Sehr wichtig und interessant sind hierbei die Überläufe, die in allen Fällen entweder mit einer Fehlermeldung abgefangen oder gespeichert werden. Theroretisch können für alle drei Variablen (h, r1 und r2) Zahlen bis 255 eingesetzt werden. Die Berechnung arbeitet bis zur letzten Multiplikation auf jeden Fall korrekt. Wirklich problematisch wird erst die Division am Ende. Dabei wird das Doppelwort DX:AX durch 21 geteilt und das Ergebnis in AX gespeichert. Dieses Ergebnis darf jedoch in keinem Fall größer als 65535 sein! Um den Programmabsturz zu verhindern, der in diesem Fall auftritt, werden die Zahlen bereits vor der Division geprüft.

Um das Programm erst einmal starten zu können, muss eine Geheimzahl als Parameter an der Kommandozeile angegeben werden. Ich habe mich für die „0“ entschieden. (Ab Windows 2000 muss statt dessen „00“ eingegeben werden, da die benutze Routine nicht tollerant genug ist.) Je nachdem ob die Zahl fehlt oder falsch ist, wird eine von zwei Fehlermeldungen gezeigt. Im ersten Fall wird der Anwender freundlich darauf hingewiesen, eine Zahl anzugeben. Im zweiten Fall ertönt ein Piepton. Auf einen Tastendruck wird dann absichtlich nicht mehr gewartet.

Das erste Makro, das im Programm zum Einsatz kommt, löscht den Bildschirm. Ich habe zur Lösung dieser Aufgabe einen gänzlich anderen Weg eingeschlagen, als in der Vorlesung besprochen. Ich stelle einfach den Grafikmodus neu ein. In diesem Fall ist es die Nummer 3 (farbiger Textmodus, 80 x 25 Zeichen). Die Interrupt-Funktion hat den praktischen Nebeneffekt, dass sie automatisch auch den Bildschirm löscht.

Eine andere kleine Besonderheit des Programmes ist die Eingabe der Radien r1 und r2. Die beiden Zeilen sind an einer Stelle im Programm vertauscht, um den Anwender bei der Dateneingabe nicht unnötig zu verwirren. Auf die Berrechnung wirkt sich dieser Tausch jedoch nicht aus.

Die Interrupt-Routine, die den Inhalt der Register AX bis DX am Bildschirm anzeigt, sorgt intern dafür, dass sämtliche Register nach der erfolgreichen Abarbeitung wieder auf ihre ursprünglichen Werte zurück gesetzt werden. Dank dieser Sicherheitsmaßnahme kann der Interrupt an jeder beliebigen Stelle aufgerufen werden, ohne dass er sich irgendwie auf die Registerinhalte auswirkt.

Die Ausgabe des Ergebnisses verteilt sich auf zwei Unterprogramme. Zuerst wird der ganzzahlige Anteil des Ergebnisses angezeigt („AusgabeZahl16“). Um diese Prozedur, die auch in der Interrupt-Routine zum Einsatz kommt, nicht verändern zu müssen, habe ich zur Ausgabe des Nachkomma-Anteiles eine weitere speziell angepasste Prozedur erstellt („AusgabeKomma“). Diese teilt den Restwert wiederum durch 21 und gibt die ersten drei Stellen dieser Berechnung aus.

Am Ende kann der Anwender wählen, ob er noch eine weitere Berechnung durchführen will. Wenn er an dieser Stelle irgend eine beliebige andere Taste ausser dem „j“ drückt, wird das Programm beendet.

Bitte beachten Sie auch, dass die Bildschirmausgaben des Programmes bewusst einfach gehalten wurden. Farben oder gar Grafiken würden das Programm zwar optisch aufwerten, der Aufwand würde jedoch in keinen Verhältnis zum Nutzen stehen.

Der kommentierte Quellcode „kugelsch.asm“ (für TASM Turbo Assembler) und das ausführbare Programm „kugelsch.exe“ können hier herunter geladen werden.

Weiterführende Links