asm00b.png
Edit v0.050 from 2007-11-04 to 2011-06-28 by HSc

80x86-Assembler

Wie tickt ein 80x86-Code-System ganz unten, wo Codes eingegebenen werden, Interrupts und Port-Handling normal sind.

Das 1. Programm mit seinem Quelltext, dessen Umsetzung in ein lauffähiges Programm und das Ergebnis dieser Arbeit.
Lektionen zum Thema
  • Grundlagen;
  • Quellcode-Beispiele zu den Elementen der Programmiersprache;
  • Konsole mit Eingaben über die Tastatur und Ausgabe auf den Monitor;
  • Interrupt und dessen Nutzung,
  • KVM mit der Nutzung von Keyboard (auch prellende Taster), Videomonitor und Mouse für die Ein- und Ausgabe und
  • Clock mit Messung, Reduzierung und Ausgabe eines proportionalen Taktsignales.
Die Hardware für die die Programme entwickelt und eingesetz worden.
Werkzeuge zur Programmerstellung incl. deren Benutztung sind Die Befehls-Codes für den Datentransfer, arithmetische, logische und Sprung-Operationen, deren Mnemonic und der benutzten Flags.

Das 1. Programmes

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 Debuger 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 maximal 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 Entwicklen 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 Programmes durch seinen Aufruf
          A01.EXE
          
  5. Debuggen bzw. Analysieren warum es so wie es läuft läuft und nicht so wie es laufen soll, durch
          TD.EXE A01.EXE
          
Diese Schritte wiederholt man solange bis man mit dem Ergebniss zufrieden ist.

Das Ergebnis

Nach Aufruf des Befehles
dir A01.*
erhält man folgende Dateien aufgelistet:
  • A01.ASM
    = Der eingegebnenen Quellcode;
  • A01.LST
    = Vom Assembler erstelle Listing-Datei mit Zusatzinformationen;
  • A01.OBJ
    = Vom Assembler erstelle Objekt-Datei;
  • A01.MAP
    = Aufteileung 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!
Edit v0.020 from 2007-11-04 to 2009-02-26 by HSc

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 daß das Betriebssystem MS−DOS und eine Batch-Datei, welche die Werkzeuge in der Reihnenfolge Editor, Assembler, Linker, das Programm selbst und zum Abschluß 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 trots 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 Mnemonic, auf deren richtige Schreibweise zu überpü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 Entwicklen 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
    

Edit v1.001 from 2011-06-06 to 2011-06-15 by HSc

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!

0. 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.


1. Befehlsbeispiele

Beispiele zu den Elementen der Operationscodes, der Mnemonic, 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.


2. Konsole

Eingabe über die Tastatur und Ausgabe über den Bildschirm, die klassischen Elemente einer Konsole. Das Programm soll ja auch steuerbar sein!


3. 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.


4. 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.

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!


Mnemonic

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 Mnemonic zum Thema "Datentransfer".
Mnemonic 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 Mnemonic zum Thema "Arithmetische Operationen".
Mnemonic 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 Mnemonic zum Thema "Logische Operationen".
Mnemonic 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 Mnemonic zum Thema "Sprung Operationen".
Mnemonic 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.

Edit v0.000 from ____-__-__ to ____-__-__ by HSc

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.


gotop.gif Nach Oben