Assembler ist die Sprache der Maschinen (2)

Der Umgang mit Maschinensprache umfasst natürlich nicht nur das Auslösen von Resets. Alles, was in höheren Programmiersprachen möglich ist, lässt sich auch in Assembler bewerkstelligen – allerdings mit erheblich mehr Aufwand. Was bedeutet mehr Aufwand?

Unser nächstes Beispiel wird es Ihnen verdeutlichen. Ein kurzes akustisches Signal auf dem PC zu erzeugen, geschieht in Turbo-Pascal beispielsweise so:

Programm Beep;

Begin
 Sound(750);
 Delay(100);
 NoSound;
End.

Das Programm ist kurz und durch Verwendung sinnentsprechender Befehle leicht verständlich. In Assembler müssen Sie die drei bequemen Anweisungen Sound, Delay (Verzögerung) und NoSound Byte für Byte selbst machen: Starten Sie Ihren Debugger und tippen Sie nach Eingabe von a das Listing in Bild 2 ein.

Die Zahlen zu Beginn jeder Zeile stellen keine Zeilennummern dar, sondern sind Speicheradressen, die Ihr PC automatisch vergibt. Sie brauchen diese also nicht einzugeben. Da die Adressen vor dem Doppelpunkt von denen auf Ihrem Bildschirm abweichen können, haben wir auf ihre Auflistung verzichtet. Achten Sie jedoch drauf, dass die Nummern hinter dem Doppelpunkt – so genannte Offsets – mit Ihren identisch sind. Wenn nicht, haben Sie sich mit Sicherheit vertippt. Suchen Sie in diesem Fall nach dem Tippfehler, geben Sie a XXXX ein und korrigieren Sie ihn. Anstelle von XXXX verwenden Sie den Offset, an dem sich der Fehler befindet:

:0100 MOV BX,02EE
:0103 MOV AX,34DD
:0106 MOV DX,0012
:0109 CMP DX,BX
:010B JNB 0132
:010D DIV BX
:010F MOV BX,AX
:0111 IN AL,61
:0113 TEST AL,03
:0115 JNZ 011F
:0117 OR AL,03
:0119 OUT 61,AL
:011B MOV AL,B6
:011D OUT 43,AL
:011F MOV AL,BL
:0121 OUT 42,AL
:0123 MOV AL,BH
:0125 OUT 42,AL
:0127 MOV CX,FFFF
:012A LOOP 012A
:012C IN AL,61
:012E AND AL,FC
:0130 OUT 61,AL
:0132 RET

Erstaunlich, was sich alles hinter dem Befehl Sound im ersten Abschnitt (0100) bis 0125) verbirgt. So genannte hexadezimale Zahlen werden in Register wie zum Beispiel AX, BX oder DX bewegt (MOVe), mit anderen Werten verglichen (CoMPare) und an bestimmte, für den Lautsprecher verantwortliche Speicherzellen ausgegeben (OUT). Aus Delay im zweiten Abschnitt (0127 bis 012A) ist eine Schleife (LOOP) geworden, die solange durchlaufen wird, bis das Register CX den Wert Null erreicht hat. NoSound wird im dritten Abschnitt (012C bis 0130) durch drei Assemblerbefehle (Mnemonics) realisiert.

Quelle: PC Magazin PLUS, August 1988

Matomo