Hilfe & Service von EDV-Fachleuten

Edit v5.012 from 2007-11-04 to 2024-07-25 by HSc

    .MODEL SMALL
    .STACK 256
    .DATA
    ...
    .CODE
    START: NOP
    

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.

  1. Erstellen bzw. Editieren des Quelltextes mit einem Editor.
        EDIT A01.ASM
         
  2. Assemblieren mit dem TurboAssembler v3.1 durch
         TASM.EXE /c /la /m /zi A01.ASM,,
         
    welches das Entwickeln leichter macht!
  3. Linken bzw. Zusammenbinden mit dem TurboLinker zu einer aufführbaren EXE-Datei durch
         TLINK.EXE /v A01.OBJ
         
  4. Ausführen des erstellten Programms durch seinen Aufruf
         A01.EXE
         
  5. Debuggen bzw. Analysieren warum es so wie es läuft und nicht so wie es laufen soll, durch
         TD.EXE A01.EXE
         
Diese Schritte wiederholt man solange bis man mit dem Ergebnis zufrieden ist.

Das Ergebnis

Nach Aufruf des Befehles
dir 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.
Wovon A01.EXE das aufrufbare und ausführbare Ergebnis ist!

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.
Die Kommas nach dem Namen des Quelltextes A01.ASM teilen den Assembler mit das die Objekt und die Listingsdatei den gleichen Namen haben, nähmlich A01.OBJ und A01.LST.

Linker

Edit v0.020 from 2007-12-23 to 2009-02-21 by HSc

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.OBJ
   
als 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.

Beispiel: A01.LST
erstellt mit dem Turbo Assembler Version 3.1.

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

Übungen für jede einzelne Befehlsgruppe, angefangen mit der
  • Vorstellung vom Aufbau eines Quelltextes,
  • über Konstanten und Variablen,
  • Speichermanipulationen,
und vieles andere mehr. Dabei sind die Lektionen von 0. bis 4. bei jeder Programmiersprache enthalten!
  1. 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.
    Dies münden in einem Quelltext (Grl*.ASM), worin alle grundsätzlichen Elemente vorhanden sind. Dieser ist auch als Muster geeignet, wenn es um die Erstellung von neuen Quelltexten geht.
  2. 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.
  3. Konsole Eingabe über die Tastatur und Ausgabe über den Bildschirm, die klassischen Elemente einer Konsole. Das Programm soll ja auch steuerbar sein!
  4. 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.
  5. 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
    die Konvertierung in andere Formate. Hier besonders das Format der BCD- und der Gleitkomma-Zahl.

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.
Tabelle 1: Befehlscode für 80x86 in hexadezimaler Darstellung von 16x16
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

Befehle hinterlassen neben dem Ergebnis auch Informationen wie es dazu kam. Z. Bsp. gab es einen Übertrag, änderte sich das Vorzeichen, usw. Für solche Informationen wurde die Flags eingeführt. Es gibt:
  • 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.
Sie werden in der Regel wie folgt dargestellt:
O D I T S Z A P C
* ? 0 1          
Die 5 Symbole geben an wie sich das Flag in Abhänigkeit vom Befehl ändert. Da wären
  •   = 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

Tabelle 2: Assembler Mnemonik zum Thema "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

Tabelle 3: Assembler Mnemonik zum Thema "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

Tabelle 4: Assembler Mnemonik zum Thema "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

Tabelle 5: Assembler Mnemonik zum Thema "Sprung 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.
Nach Oben