Edit v5.012 from 2007-11-04 to 2024-07-25 by HSc
80x86-Assembler
Wie tickt ein 80x86-Code-System ganz unten, wo Codes eingegeben werden, Interrupts und Port-Handling normal sind.
Das 1. Programms
Wenn diese grundsätzliche Notwendigkeit nicht geklärt ist und
funktioniert,
kann der Rest vergessen werden.
Denn Übung macht den Meister!
Wir haben uns für den Turbo Assembler, Linker und Debugger entschieden.
Funktioniert ab 486er
unter MS-DOS v6.22 oder an der Eingabeaufforderung nach dem Start mit
einer Windows 95/98-Bootdiskette auf einem mit FAT32 formatierten
Datenträger
(Festplattenpartition < 2GByte, USB-Stick, o.ä.).
Erhältlich sind die Programme u.a. mit Büchern
über Turbo Assembler, Borland C++ v3.1,
Turbo Pascal o.ä. wo diese auf der beigelegten CD-ROM
in der Programm-Sammlung als Bestandteil enthalten sind.
Der Quelltext
Er wird erstmal als gegeben angesehen. Minimum ist die Klärung des Speichermodels, des Beginns von Daten- und Codebereich. Das Programm selbst, welches an der Marke START beginnt und mit END START aufhört.
.MODEL SMALL .DATA .CODE START: MOV AL,08H ENDE: MOV AH,4CH INT 21H RET END START
Die Umsetzung
Das Umsetzen des Quelltextes (A01.ASM) durch das Erstellen bzw. Bearbeiten und Überführung in ein lauffähiges Programm erfolgt in 4 maximalen 5 Schritten.
-
Erstellen bzw. Editieren des Quelltextes mit einem Editor.
EDIT A01.ASM
-
Assemblieren
mit dem TurboAssembler v3.1 durch
TASM.EXE /c /la /m /zi A01.ASM,,
welches das Entwickeln leichter macht! -
Linken bzw. Zusammenbinden
mit dem TurboLinker zu einer aufführbaren EXE-Datei durch
TLINK.EXE /v A01.OBJ
-
Ausführen
des erstellten Programms durch seinen Aufruf
A01.EXE
-
Debuggen bzw. Analysieren
warum es so wie es läuft und
nicht so wie es laufen soll, durch
TD.EXE A01.EXE
Das Ergebnis
Nach Aufruf des Befehlesdir A01.*erhält man folgende Dateien aufgelistet:
-
A01.ASM
= Der eingegebenen Quellcode; -
A01.LST
= Vom Assembler erstelle Listing-Datei mit Zusatzinformationen; -
A01.OBJ
= Vom Assembler erstelle Objekt-Datei; -
A01.MAP
= Aufteilung der Speicherbereiche; -
A01.XRF
= Cross-Referenzlist und -
A01.EXE
= Das vom Linker erstellte ausführbare Programm.
Werkzeuge
Um ein lauffähiges Programm zu erstellen, sind die im folgende beschriebenen Werkzeuge nützlich!
Entwicklungsumgebung
Diese kann alle Werkzeuge enthalten und
in der benötigten Reihenfolge aufrufen.
Das spart viel Tip-Arbeit und Zeit.
Bei uns ist dass das Betriebssystem MS−DOS und
eine Batch-Datei,
welche die Werkzeuge in der Reihenfolge Editor, Assembler, Linker,
das Programm selbst und
zum Abschluss den Debugger aufruft!
Editor
Ein Editor, um das Programm (????????.ASM) zu schreiben!
Welches ist Ihr Lieblings-Texteditor?
Den sollten sie einsetzen.
Bei uns ist dies der Norton Editor NED.COM,
da er trotz seiner kleinen Größe alles minimal Notwendige
enthält.
Als Entwicklungsumgebung in der alles integrierbar ist und
die einen eigenen Editor enthält,
kann auch der Borland Editor BC.EXE genutzt werden.
Assembler
Ein Assembler, um die mit dem Editor geschriebene Mnemonik, auf deren richtige Schreibweise zu überprüfen und wenn diese gültig ist, in Operationscodes zu übersetzen und als Objekt-Datei (????????.OBJ) abzulegen.
Wir benutzen hier den TurboAssembler v3.1 TASM.EXE mit dem Aufruf
TASM.EXE /c /la /m /zi A01.ASM,,welches das Entwickeln leichter macht und im Einzelnen bedeutet:
- /c = Erzeuge beim Assemblieren ein Cross-Referenzliste gleich mit;
- /la = Erzeuge ein erweitertes bzw. ausführliches Listing;
- /m = automatische werden soviel Durchläufe durchgeführt, wie notwendig sind um alle Marken, Sprungadressen zu ermittelen;
- /zi = Binde alle erhältlichen Informationen für das Debuggen mit ein.
Linker
Einen Linker, um einen oder mehrere Objektdateien mit den im Programmtext aufgerufenen Bibliotheken zu verbinden und daraus ein aufführbares Programm (????????.EXE) zu erzeugen.
Wir benutzen hier den Turbo Linker TLINK.EXE mit:
TLINK.EXE /v A01.OBJals Option wurde hier verwendet:
- /v = Einbindung der vollen Debugger-Informationen
Jeder Linker kann eine Dokumentation seiner Arbeit, bzw. wie er die Aufgabe verstanden und umgesetzt hat, liefern. Diese Dokumentation enthält neben dem Quellcode, auch noch die vom Linker ermittelten Informationen, und ist damit aussagekräftiger als der bloße Quelltext. Im folgenden wird das Format der Ausgabe erläutert.
-
Der assemblierte Quelltext als
Code-Block
mit
- Nummer der Listingzeile;
- Adresse in der der folgende Code abglegt wird;
- der Code in binärer Form selbst und
- die dazugehörige Quellcode-Zeile.
- Die Symbol-Tabellen mit der Liste von Namen, deren Adressen bzw. Bereichen. Diese Name können Variablen, Konstanten, Speicherbereiche und andere vereinbarte und zur Verfügung stehende Namen sein.
- Die Gruppen- und Segmentbereiche.
In der Zeile Nr. 5, an der Adresse 0000H wurde der Befehle MOV AL,08H in B0 08 übersetzt.
a01.80x86 1 0000 .MODEL SMALL 2 0000 .DATA 3 0000 .CODE 4 5 0000 B0 08 START: MOV AL,08H 6 7 0002 B4 4C ENDE: MOV AH,4CH 8 0004 CD 21 INT 21H 9 0006 C3 RET 10 11 END START
Der Name START aus der Zeile Nr. 5 des assemblierten Quelltextes ist im Speicherbereich Near vom Typ _TEXT und verweist auf die Adresse 0000H.
Symbol Table Symbol Name Type Value Cref (defined at #) ??DATE Text "23/12/07" ??FILENAME Text "a01" ??TIME Text "15:06:06" ??VERSION Number 030A @32BIT Text 0 #1 @CODE Text _TEXT #1 #1 #3 @CODESIZE Text 0 #1 @CPU Text 0101H @CURSEG Text _TEXT #2 #3 @DATA Text DGROUP #1 @DATASIZE Text 0 #1 @FILENAME Text A01 @INTERFACE Text 00H #1 @MODEL Text 2 #1 @STACK Text DGROUP #1 @WORDSIZE Text 2 #2 #3 ENDE Near _TEXT:0002 #7 START Near _TEXT:0000 #5 11
Das Segment _TEXT, dessen Größem mit einem 16 Bit-Wert beschrieben werden kann, hat eine Größe von 007 Bytes, die Ausrichtung ist Word (2 Byte) und sie gehört zum öffentlichen Teil des Maschinen-Codes.
Groups & Segments Bit Size Align Combine Class Cref (defined at #) DGROUP Group #1 1 _DATA 16 0000 Word Public DATA #1 #2 _TEXT 16 0007 Word Public CODE #1 1 #3 3
Debugger
Einen Debugger, um herauszufinden warum das Programm so läuft wie es läuft und nicht so wie es laufen soll. Dazu rufen wir ihn mit dem Programm auf, welches beim Assemblieren, Linken die Debug-Informationen mitbekommen hat.
TD.EXE A01.EXE
Lektionen
- Vorstellung vom Aufbau eines Quelltextes,
- über Konstanten und Variablen,
- Speichermanipulationen,
-
Grundlagen
Zur Aufzeigung von allen grundsätzlich in einen Quelltext
vorhandenen Elementen bei diesem Programm-System.
Dazu gehören:
- Das 1. Programm incl. seiner Kommentare.
- Grundsätzliche Struktur des Quelltextes mit möglichen Inhalt bzgl. Speichermodel, Prozessormodel, Beginn und Ende und der Vergabe von Namen.
- Konstanten , Variablen, Marken und deren Verwendung.
- Deklarieren von Funktionen und Proceduren, und deren Aufruf und Nutzung.
- Befehlsbeispiele Beispiele zu den Elementen der Operationscodes, der Mnemonik, der Programmiersprache, etc. Diese Beispiele sollten immer, wenn es eine Frage zu einem Befehl gibt, erstellt werden und damit sie leichter gefunden werden, auch dessen Namen tragen.
- Konsole Eingabe über die Tastatur und Ausgabe über den Bildschirm, die klassischen Elemente einer Konsole. Das Programm soll ja auch steuerbar sein!
- Interrupt Wo befindet sich Interrupt-Tabelle und wie ist sie aufgebaut. Einstellen der Adresse fuer den Interrupt. Schreiben einer Interrupt-Funktion. Interrupt freigeben und sperren. Ausloesen eins Interrupt und dessen Nutzung. Durch die Nutzung von Interrupts kann das Programm kann auf Ereignisse reagieren und diese zwischendurch abarbeiten.
-
Keyboard Video Mouse
Nutzung von Keyboard, Monitor und Mouse für die Ein- und Ausgabe.
Dazu gehören Funktionen zur Verarbeitung von
- Zahlen,
- Texten,
- Datum,
- Uhrzeit und
Hardware
Wie ist nun die Hardware verdrahtet? Der 8086er selbst intern und das Mainboard? Darüber haben andere ganze Bücher geschrieben, angefangen beim AT80 286, so das wir hiermit auf diese verweisen.
Befehls-Code
Die Befehle teile sich in
- Arithmetische Befehle zur Addition, Subtraktion, Multiplikation und Division;
- Bit-Manipulation von Einzel-Bits;
- Befehle zur Datenübertragung wie Ein-/Ausgabe, Adressierung, Konvertierung, Statusmanipulation und Datentransport-Befehle;
- Befehle zur Unterstützung von Hochsprachen;
- Logische Befehle.
- Schiebebefehle;
- Kontrollbefehle der CPU;
- Sprungbefehle;
- Schleifenbefehle;
- Schutzbefehle und
- String-Manipulationen.
Code | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00H | NOP | AJMP page 0 | LJMP adr16 | RR A | INC A | INC adr16 | INC A,@R0 | INC A,@R1 | INC R0 | INC R1 | INC R2 | INC R3 | INC R4 | INC R5 | INC R6 | INC R7 |
10H | ||||||||||||||||
20H | ||||||||||||||||
30H | ||||||||||||||||
40H | ||||||||||||||||
50H | PUSH AX | PUSH BX | MOV AH,r | POP AX | POP BX | |||||||||||
60H | RET | INT | ||||||||||||||
70H | ||||||||||||||||
80H | ||||||||||||||||
90H | ||||||||||||||||
A0H | ||||||||||||||||
B0H | ||||||||||||||||
C0H | ||||||||||||||||
D0H | ||||||||||||||||
E0H | ||||||||||||||||
F0H |
Flags
- O = Overflow-Flag
- D = Direction-Flag
- I = Interrupt-Flag
- T = Trap-Flag
- S = Signum-Flag
- Z = Zero-Flag
- A = Auxiliary-Carry-Flag, z. dt. ein Übertrag vom 3 zum 4 Bit im Byte;
- P = Parity-Flag
- C = Carry-Flag, z. dt. wenn ein Übertrag aus dem högstwertigen Stelle eines Bytes heraus erfolgt. Vor allen bei bei einer Addition und Subtraktionen der Fall.
O | D | I | T | S | Z | A | P | C |
---|---|---|---|---|---|---|---|---|
* | ? | 0 | 1 |
- = umbeeinflust;
- * = entsprechend dem Ergebnis des Befehls;
- ? = nach der Operation nicht definiert;
- 0 = Immer gelöscht und
- 1 = Immer gesetzt!
Mnemonik
Eine menschlich verständlichere Darstellung des Befehlskodes. Natürlich können Sie statt
MOV AL,8D ; Nach dem Semikolon kann Kommentar geschrieben werden
was ausgesprochen "move al, 8 dezimal" und übersetzt "Lade Register AL mit den dezimal angegebnen Wert 8" heißt, auch durch Eingabe des Codes B0 08H an der Adresse 0100H im Debugger (z.Bsp. von MS-DOS v5.00) realisieren. Wir würden dies aber nur in Ausnahmesituationen empfehlen.
Datentransfer
Mnemonik und Befehl-Code | Zyklen | Beschreibung mit Verweis auf ein Beispiel |
---|---|---|
Ein Befehl zum nichts tun (no operation) | ||
NOP 00 |
1 | Es wird nichts getan, außer Zeit verbraucht. Dies kann manchmal wichtig sein, beim Warten und Zeitmessungen. |
MOV-Befehle | ||
MOV AL,#c08 74 ?? |
1 | Kopiere der Konstante (#c08) in das 8Bit−Register AL. |
Arithmetische Operationen
Mnemonik und Befehl-Code | Zyklen | Beschreibung mit Verweis auf ein Beispiel |
---|---|---|
MOV-Befehle | ||
MOV AL,#c08 74 ?? |
1 | Kopiere der Konstante (#c08) in das 8Bit−Register AL. |
Logische Operationen
Mnemonik und Befehl-Code | Zyklen | Beschreibung mit Verweis auf ein Beispiel |
---|---|---|
MOV-Befehle | ||
MOV AL,#c08 74 ?? |
1 | Kopiere der Konstante (#c08) in das 8Bit−Register AL. |
Sprunge Operationen
Mnemonik und Befehl-Code | Zyklen | Beschreibung mit Verweis auf ein Beispiel |
---|---|---|
MOV-Befehle | ||
MOV AL,#c08 74 ?? |
1 | Kopiere der Konstante (#c08) in das 8Bit−Register AL. |