Wofür gibt es Interrupts?

Sicher fragen Sie sich jetzt, woher Sie wissen sollen, welches Byte oder gar Bit im Arbeitsspeicher Ihres PCs wofür verantwortlich ist. Damit sind wir auch schon bei der nächsten Schlußfolgerung:

Ohne Kenntnis über die interne Architektur des Microprozessors und Ihres PCs ist eine erfolgreiche Programmierung in Assembler bzw. DEBUG mit großer Wahrscheinlichkeit zum Scheitern verurteilt. Das Betriebsystem bietet jedoch für die wichtigsten und am häufigsten gebrauchten Aktionen eine Reihe standardisierter Routinen, die sich als DOS- oder BIOS-Funktionen über sogenannte Interrupt-Befehle aufrufen lassen. Dadurch läßt sich der Aufwand für ein Assemblerprogramm schon um ein Vielfaches verringern. Beweis: Weil SOUND.DEB nichts weiter als einen kurzen Ton erzeugt, können Sie diese Routine auch viel einfacher haben. Probieren Sie einmal die folgenden Zeilen aus:

A
MOV AH,02
MOV DL,07
INT 21
RET

RCX
7
NBEEP.COM
W
Q

BEEP.DEB erzeugt annähernd das gleiche Signal wie SOUND.DEB, doch – Dank Interrupts – mit erheblich weniger Aufwand. Zufällig handelt es sich um einen der am häufigsten verwendeten DOS-Interrupts: 21h. Die sich hinter den Funktionsnummern verbergenden Routinen eines Interrupts sind wie bereits erwähnt standardisiert und erwarten meist bestimmte Parameter. In unserem Beispiel erhält das Register AH den Wert 02h – nämlich die Nummer der Funktion zur Ausgabe eines Zeichens. Das Register DL erhält den Code des auszugebenden Zeichens: 07h. Dieser ASCII-Code ist das Steuerzeichen für »Beep«. Geben Sie auf der DOS-Ebene einfach mal den Befehl »ECHO Alt + 7 ein«, wobei Sie die 7 des Nummerblocks verwenden müssen. Sie hören haargenau dasselbe Signal wie beim Ausführen des Programms BEEP.COM. Nachdem also bestimmte Parameter in konkrete Register plaziert wurden, kommt es zur Ausführung des Interrupt-Befehls: »INT 21«. Danach kehrt das Programm auf die DOS-Ebene zurück (RETurn).

Der Vorteil von Interrupts ist – wie sich leicht erkennen läßt – zugleich ihr Nachteil. Solange Sie nämlich »alltägliche« Dinge programmieren wollen, können und sollten (!) Sie sich der rund 20 Interrupts mit insgesamt zirka 180 Unterfunktionen bedienen. Gefällt Ihnen jedoch z. B. das akustische Signal von BEEP überhaupt nicht – wollen Sie, daß es eine andere Frequenz hat und der Ton einfach länger oder kürzer dauert, ist der »einfache« (und unter den meisten PCs mit unterschiedlichen DOS-Versionen hundertprozent kompatible) Weg über den Interrupt 21h einfach nicht flexibel genug. Deshalb hat z. B. das um einige Zeilen längere und kompliziertere SOUND.DEB seine volle Existenzberechtigung. Probieren Sie doch mal das folgende Beispiel aus (Prüfsumme = E6A0):

A
MOV AX,13           ;100
CALL 113            ;103
CALL 13C            ;106
INC AX              ;109
CMP AX,1388         ;10A
JNZ 103             ;10D
CALL 142            ;10F
RET                 ;112
PUSH AX             ;113
MOV BX,AX           ;114
MOV AX,34DD         ;116
MOV DX,12           ;119
CMP DX,BX           ;11C
JNB 13A             ;11E
DIV BX              ;120
MOV BX,AX           ;122
IN AL,61            ;124
TEST AL,3           ;126
JNZ 132             ;128
OR AL,3             ;12A
OUT 61,AL           ;12C
MOV AL,B6           ;12E
OUT 43,AL           ;130
MOV AL,BL           ;132
OUT 42,AL           ;134
MOV AL,BH           ;136
OUT 42,AL           ;138
POP AX              ;13A
RET                 ;13B
MOV CX,64           ;13C
LOOP 13F            ;13F
RET                 ;141
IN AL,61            ;142
AND AL,FC           ;144
OUT 61,AL           ;146
RET                 ;148

RCX
49
NPFIFF.COM
W
Q

Durch die Veränderung einiger Details liefert Ihnen PFIFF.DEB Spielcasino-Geräusche. Die Routine SOUND.DEB ist fast unverändert erhalten geblieben. Am Anfang des Programms sind jedoch ein paar Zeilen hinzugekommen, die die Höhe der Frequenz bestimmen: Das Unterprogramm zur Erzeugung des akustischen Signals in den Zeilen »… ;113« bis »… ;13B« wird solange mit unterschiedlichen Werten aufgerufen, bis laut Zeile »CMP AX,1388 ;10A« eine bestimmte Frequenz, nämlich 5000 Hz (1388h) erreicht ist. Die Dauer von »Delay« (;13C bis ;141) wurde verkürzt, »NoSound«, im hinteren Teil des Listings (;142 bis ;148), bleibt unverändert. Wie Sie jetzt erkennen können, dienen die Zahlen hinter dem Semikolon ausschließlich der Orientierung, damit Sie z. B. »Jump«- und »Call«-Befehle nachvollziehen können.

Fassen wir kurz zusammen: Es gibt also nicht nur unterschiedliche Sprachen zur Programmierung, sondern auch unterschiedliche Wege innerhalb einer Sprache – auch oder gerade in Assembler. Alles hat seine Vor- und Nachteile. Die Verwendung von standardisierten Interrupts und deren Unterfunktionen sorgt für höchstmögliche Kompatibilität und damit Portabilitität – hardwarenahe Programmierung garantiert höchstmögliche Flexibilität, sorgt aber auch für erhöhte Absturzgefahr. Die Wahl bleibt Ihnen überlassen.

Wenn Sie also nicht über Sammlungen (»Bibliotheken«) von kleinen nützlichen Routinen wie unsere Tips und Tricks verfügen oder in Unkenntnis über sogenannte DOS-Funktions- bzw. BIOS-Aufrufe sind, müssen Sie so ziemlich oft das Rad neu erfinden. Unser Buch kann Ihnen jedoch eine ganze Reihe fertiger Routinen und im Anhang auch Tabellen zu den wichtigsten Systemeigenschaften bieten.

Quelle: 200 Utilities für PC-/MS-DOS von Gerhard Schild und Thomas Jannot