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