ASM Tutorial:
Inhalt:
1. Einleitung
2. Übersetzen/Compiliern
3. Der Prozessor (CPU Central Prozess Unit)
4. Die Register und Flagen
5. Kleines Programm
6. Bedingter Sprung mit jne (Jump not equal)
7. Unterprogramm
8. Die Bedeutung von Interrupts (am Beispiel vom BIOS Interrupt 10h)
9. Nachwort
Einleitung
Zum Inhaltsverzeichnis Dieses Tutorial soll einen kleinen Einstieg und Einblick in die 80/86 Assambler Programmierung geben. Erstmal ein kommen ein paar Grundlagen. Ein Compiler (DOS) wär nicht schlecht, damit ihr eure Programme übersetzen könnt. Am Anfang braucht ihr noch keinen. Assambler ist extrem Hardware nah, dass heißt man kommuniziert direkt mit der Hardware und müsst deswegen auch über die Hardeware bescheid wissen und bedenkt, dass unser Pc beim Programmieren wie ein 8086 behandelt wird.Zum Inhaltsverzeichnis Ihr schreibt euer Programm im Editor von Windows und speichert das ganze dann unter beliebig.asm. Zum übersetzen reicht dann die Dos Box. Zuerst wird die .obj Datei erstellt. Diese müßt ihr dann (nochmals) linken/compiliern um eine .exe zu erhalten die unter Windows läuft. Ein Compiler und Linker hier zum Download. Wir nennen unsere Datei zum Beispiel test.asm Wechselt in das richtige Verzeichnis (dort wo euer Linker und Quellcode ist) und gebt ein: asm test Nun wird die obj. Datei erstellt, wenn kein Fehler vorliegt. Bei einem Fehler wird oft die Zeile angegeben in der sich der Fehler Befindet. Die obj. Datei linkt ihr jetzt mit: link dann den namen der .obj Datei angeben also: test dann angeben wie die .exe heißen soll z.B: test Dann ein paar mal ENTER, der Rest ist nämlich egal.
Übersetzen/CompiliernZum Inhaltsverzeichnis Eine CPU steuert, regelt und kontrolliert Arbeitsprozesse in einem Computer. Die CPU besteht in ihrem Aufbau aus zwei unterschiedlichen Funktionseinheiten, zum einen aus der Verarbeitungseinheit EU (Execute Unit) und aus der Busverbindungseinheit BIU (Bus Interface Unit). Die EU hat sogenannte Register die sehr wichtig in der Assambler Programmierung sind. Ein Register hat die größe von 16 Bit. Die Allgemeinen Register kann man in Heigh und Low Register teilen, die dann jeweils 8 Bit groß sind. Es gibt ausserdem noch sogennante Flags (Flagen).
Der Prozessor (CPU Central Prozess Unit)Zum Inhaltsverzeichnis
Die Register und Flagen
Allgemeine Register: | Abkürzung: | Art: | High | Low |
Akkumulator | AX | (Arbeitsregister - Ergebnisregister)) | AH | AL |
Basisregister | BX | (Base - Zeiger) | BH | BL |
Zählregister | CX | (Count) | CH | CL |
Datenregister | DX | (Data - Zeiger) | DH | DL |
Offsetregister: (Adressabstand im Segment) | Abkürzung: | Art: |
Basiszeiger | BP | (Base Pointer) |
Quellindex | SI | (String Index - Zeiger) |
Zielindex | DI | (Destination Index - Ziel) |
Stapelzeiger | SP | (Stack Pointer) |
Segmentregister: (Adressabschnitt des RAMs) | Abkürzung: | Art: |
Codesegment | CS | (Code Segment) |
Datensegment | DS | (Data Segment) |
Extrasegment | ES | (Extra Segment) |
Stapelsegment | SS | (Stack Segment) |
Statusregister: | Abkürzung: | Art: |
Befehlszähler | IP | (Instruction Pointer) |
Flagregister | FLAGS | (Fahne) |
Abkürzung: | Name: | Art: |
CF | Carry Flag | (Übertrag) |
PF | Parity Flag | (Parität) |
AF | Auxiliary Carry Flag | (Zusatzübertag) |
ZF | Zero Flag | (Null) |
SF | Sign Flag | (Vorzeichen) |
TF | Trap Flag | (Fall) |
IF | Interrupt Flag | (Unterbrechung) |
DF | Direction Flag | (Richtung) |
OF | Overflow Flag | (Überlauf) |
Dezimal: | Hexadezimal | Binär |
1 | 1 | 1 |
2 | 2 | 10 |
3 | 3 | 11 |
4 | 4 | 100 |
5 | 5 | 101 |
6 | 6 | 110 |
7 | 7 | 111 |
8 | 8 | 1000 |
9 | 9 | 1001 |
10 | 10 | 1010 |
11 | A | 1011 |
12 | B | 1100 |
13 | C | 1101 |
14 | D | 1110 |
15 | E | 1111 |
16 | F | 10000 |
17 | 11 | 10001 |
18 | 12 | 10010 |
19 | 13 | 10011 |
20 | 14 | 10100 |
65535 | FFFF (4 Ziffern) | 1111111111111111 (16 Bit) |
? | Hilfe |
R | Registeranzeige |
A | Assamblieren |
T | Schrittweise ausführen |
Q | Beenden |
Die Funktionen den Interruptes 10h (Video-BIOS) stellt die folgende Tabelle dar:
Funktion | Unter- Funktion | Bedeutung | Eingabe | Ausgabe | BIOS - Implementierung | Anmerkungen |
00h | - | Video - Modus setzen | AH=00h AL=Videomodus | keine | PC, XT, AT, PS/2 | Videomodi |
01h | - | Cursor - Größe | AH=01h CH=Startzeile CL=Endzeile | keine | PC, XT, AT, PS/2 | Die Angaben im CX-Register beziehen sich auf die logische Zeile eines Zeichens (von oben). Der Bereich der Werte hängt von der Zeichengröße und der verwendeten Videokarte ab. |
02h | - | Cursorposition ändern | AH=02h BH=Nummer der Bildschirmseite DH=Zeile DL=Spalte | keine | PC, XT, AT, PS/2 | Liegt ein angegebener Bereich im Register DX nicht innerhalb einer sichtbaren Position, kann der Cursor verschwinden. |
03h | - | Cursorposition lesen | AH=03h BH=Nummer der Bildschirmseite | DH=Zeile DL=Spalte CH=Startzeile CL=Endzeile | PC, XT, AT, PS/2 | Start- und Endzeile sind Werte entsprechend Funktion 01h. |
04h | - | Lichtstiftposition abfragen | ??? | ??? | EGA | Es lagen leider nicht genügend Informationen zu dieser Funktion vor. |
05h | - | Bildschirmseite wählen | AH=05h AL=Nummer der Bildschirmseite | keine | PC, XT, AT, PS/2 | Zulässige Werte sind von der installierten Videokarte abhängig |
06h | - | Rechteckigen Bereich des Bildschirms aufwärts rollen | AH=06h AL=Anzahl Zeilen CH=obere Zeile CL=linke Spalte DH=untere Zeile DL=rechte Spalte BH=Attribut für neue Zeilen | keine | PC, XT, AT, PS/2 | Wird für AL 0 übergeben, wird der ganze Bereich gelöscht. Die Funktion bezieht sich immer auf die aktuelle Bildschirmseite. |
07h | - | Rechteckigen Bereich des Bildschirms abwärts rollen | AH=07h AL=Anzahl Zeilen CH=obere Zeile CL=linke Spalte DH=untere Zeile DL=rechte Spalte BH=Attribut für neue Zeilen | keine | PC, XT, AT, PS/2 | Wird für AL 0 übergeben, wird der ganze Bereich gelöscht. Die Funktion bezieht sich immer auf die aktuelle Bildschirmseite. |
08h | - | Lesen eines Zeichens an der aktuellen Cursorposition | AH=08h BH=Nummer der Bildschirmseite | AL=ASCII - Code des Zeichens AH=Attribut des Zeichens | PC, XT, AT, PS/2 | - |
09h | - | Schreiben eines Zeichens | AH=09h BH=Nummer der Bildschirmseite CX=Anzahl der Wiederholungen AL=ASCII - Code BL=Attribut / Farbe | keine | PC, XT, AT, PS/2 | Es werden CX Zeichen ausgegeben. Steuercodes werden nicht berücksichtigt. Im Grafikmodus erfolgt kein Zeilenumbruch, außerdem bedeutet ein gesetztes Bit 7 im Register BL, daß die Zeichenfarbe mit dem aktuellen Zeichenmuster XOR-verknüpft wird. |
0Ah | - | Schreiben eines Zeichens | AH=0Ah BH=Nummer der Bildschirmseite CX=Anzahl der Wiederholungen AL=ASCII - Code BL=Farbe im Grafikmodus | keine | PC, XT, AT, PS/2 | Es werden CX Zeichen ausgegeben. Steuercodes werden nicht berücksichtigt. Im Grafikmodus erfolgt kein Zeilenumbruch, außerdem bedeutet ein gesetztes Bit 7 im Register BL, daß die Zeichenfarbe mit dem aktuellen Zeichenmuster XOR-verknüpft wird. |
0Bh | 00h | Rahmen- / Hintergrundfarbe setzen | AH=08h BH=0 BL=Rahmen- / Hintergrundfarbe | keine | PC, XT, AT, PS/2 | Im Textmodus wird nur der Bildschirmrahmen, im Grafikmodus der gesamte Bildschirm bestimmt. |
0Bh | 01h | Farbpalette wählen | AH=0Bh BH=1 BL=Nummer der Farbpalette | keine | PC, XT, AT, PS/2 | Diese Funktion wählt eine der beiden Farbpaletten für den 320x200-Grafikmodus aus. |
0Ch | - | Bildpunkt setzen (Grafik-Modus) | AH=0Ch BH=Nummer der Bildschirmseite DX=Zeile CX=Spalte AL=Farbe | keine | PC, XT, AT, PS/2 | Der Wertebereich in BL ist abhängig vom momentanen Videomodus und gilt als relativer Wert zur aktuellen Farbpalette. |
0Dh | - | Bildpunkt lesen (Grafik-Modus) | Ah=0Dh BH=Nummer der Bildschirmseite DX=Zeile CX=Spalte | AL=Farbe | PC, XT, AT, PS/2 | Der Wertebereich in BL ist abhängig vom momentanen Videomodus und gilt als relativer Wert zur aktuellen Farbpalette. |
0Eh | - | Zeichen an aktuelle Cursorposition schreiben und Position aktualisieren | AH=0Eh AL=ASCII - Code BL=Farbe im Grafikmodus | keine | PC, XT, AT, PS/2 | Als Farbe wird das aktuelle Attribut verwendet. Es erfolgt wenn nötig ein Zeilenumbruch. Steuerzeichen werden als solche erkannt. |
0Fh | - | Video - Modus lesen | AH=0Fh | AL=Nummer des Video - Modus AH=Anzahl der Zeichen pro Zeile BH=Nummer der aktuellen Bildschirmseite | PC, XT, AT, PS/2 | |
10h | 00h | Palettenregister setzen | AH=10h AL=0 BL=Nummer des Palettenregisters BH=Farbwert | keine | EGA, VGA, PS/2 | Bestimmt den Farbwert eines Punktes in den 16-Farb-Modi. |
10h | 01h | Rahmenfarbe setzen | AH=10h AL=1 BH=Farbwert | keine | EGA, VGA, PS/2 | - |
10h | 02h | Alle Palettenregister setzen | AH=10h AL=2 ES=Segmentadresse der Farbtabelle DX=Offsetadresse der Farbtabelle | keine | EGA, VGA, PS/2 | Verändert alle Palettenregister einschließlich des Rahmens. ES:DX zeigt auf eine Tabelle mit 17 Einträgen für die Palettenregister. |
10h | 03h | Hintergrund - Intensität / Blinkenattribut setzen | AH=10h AL=3 BL=Blink - Attribut (0: helle Hintergrundfarben, 1: Blinken) | keine | EGA, VGA, PS/2 | Diese Funktion ermöglicht die Darstellung von 16 Hintergrundfarben und legt damit fest, wie Bit 7 des Attribut - Bytes interpretiert wird. |
10h | 07h | Palettenregister lesen | AH=10h AL=7 BL=Nummer des Palettenregisters | BH=Farbwert | VGA, PS/2 | - |
10h | 08h | Rahmenfarbe lesen | AH=10h AL=8 | BH=Rahmenfarbe | VGA, PS/2 | - |
10h | 09h | Alle Palettenregister lesen | AH=10h AL=9 ES=Segmentadresse der Farbtabelle DX=Offsetadresse der Farbtabelle | Farbtabelle in ES:DX | VGA, PS/2 | Gegenstück zu Unterfunktion 2h. |
10h | 10h | DAC - Register setzen | AH=10h AL=10h BX=Registernummer CL=Blauanteil CH=Grünanteil DH=Rotanteil | keine | VGA, PS/2 | Für die Farbwerte sind Werte zwischen 0 und 63 (6 Bit) zulässig. Die VGA-Karte verwendet DAC (Digital - Analog - Converter) - Register, um digitale Farbsignale, bestehend aus 18 Bit, in analoge Monitorsignale umzuwandeln. |
10h | 12h | Mehrere DAC - Register setzen | AH=10h AL=12h BX=Nummer des ersten Registers CX=Anzahl der Register ES=Segmentadresse der Farbtabelle DX=Offsetadresse der Farbtabelle | keine | VGA, PS/2 | Setzt CX DAC - Register mit den Werten aus dem Puffer, die in der Reihenfolge Rot-Grün-Blau abgelegt sein müssen. |
10h | 13h | Methode der Farbauswahl festlegen oder DAC - Register - Gruppe auswählen | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
10h | 15h | DAC - Register lesen | AH=10h AL=15h BX=Registernummer | CL=Blauanteil CH=Grünanteil DH=Rotanteil | VGA, PS/2 | Farbwerte liegen zwischen 0 und 63. |
10h | 17h | Mehrere DAC - Register lesen | AH=10h AL=17h BX=Nummer des ersten Registers CX=Anzahl Register ES=Segmentadresse der Farbtabelle DX=Offsetadresse der Farbtabelle | Farbtabelle in ES:DX | VGA, PS/2 | - |
10h | 18h | DAC - Mask - Register laden | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
10h | 19h | Inhalt des DAC - Mask - Registers auslesen | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
10h | 1Ah | Methode der Farbauswahl und Inhalt des Color - Select - Registers ermitteln | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
10h | 1Bh | Inhalt der DAC - Farbregister in Grauwerte umwandeln | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
11h | 00h | Zeichensatz laden | AH=11h AL=0 BH=Byte pro Zeichen BL=Zeichentabelle (0 oder 1) CX=Zeichenzahl DX=ASCII - Code des ersten Zeichens ES=Segmentadresse der Zeichentabelle Offsetadresse der Zeichentabelle | keine | EGA, VGA, PS/2 | Lädt einen benutzerdefinierten Zeichensatz in den Grafikspeicher der Videokarte. Der Zeichensatz wird nicht aktiviert, die Größe der Zeichen nicht der Bildschirmdarstellung angepaßt. |
11h | 01h | 8*14 - Zeichensatz laden | AH=11h AL=1 BL=Zeichentabelle | keine | EGA, VGA, PS/2 | Lädt 8*14 - Zeichensatz, aktiviert ihn aber nicht. |
11h | 02h | 8*8 - Zeichensatz laden | AH=11h AL=2 BL=Zeichentabelle | keine | EGA, VGA, PS/2 | Lädt 8*8 - Zeichensatz, aktiviert ihn aber nicht. |
11h | 03h | Zeichensatz aktivieren | AH=11h AL=3 BL=Nummer des Zeichensatzes | keine | EGA, VGA, PS/2 | Diese Funktion aktiviert einen der vier Zeichensätze. |
11h | 04h | 8*16 - Zeichensatz laden | AH=11h AL=4 BL=Zeichentabelle | keine | VGA, PS/2 | Lädt 8*16 - Zeichensatz, aktiviert ihn aber nicht. |
11h | 10h | Zeichensatz laden & aktivieren | AH=11h AL=10h BH=Byte pro Zeichen BL=Zeichentabelle (0 oder 1) CX=Zeichenzahl DX=ASCII - Code des ersten Zeichens ES=Segmentadresse der Zeichentabelle BP=Offsetadresse der Zeichentabelle | keine | EGA, VGA, PS/2 | Lädt einen benutzerdefinierten Zeichensatz in den Grafikspeicher der Videokarte. Der Zeichensatz wird aktiviert und die Größe der Zeichen der Bildschirmdarstellung angepaßt. |
11h | 11h | 8*14 - Zeichensatz aktivieren | AH=11h AL=11h BL=Zeichentabelle | keine | VGA, PS/2 | Lädt den 8*14 - Zeichensatz und aktiviert ihn. Die VGA - Karte schaltet dazu in den 28 - Zeilen - Modus. |
11h | 12h | 8*8 - Zeichensatz aktivieren | AH=11h AL=12h BL=Zeichentabelle | keine | EGA, VGA, PS/2 | Lädt den 8*8 - Zeichensatz und aktiviert ihn. Die VGA - Karte schaltet dazu in den 50 - Zeilen - Modus (EGA 43). |
11h | 14h | 8*16 - Zeichensatz aktivieren | AH=11h AL=14h BL=Zeichentabelle | keine | VGA, PS/2 | Lädt den 8*16 - Zeichensatz und aktiviert ihn. |
11h | 30h | Zeichensatz - Informationen | AH=11h AL=30h BH=Zeichensatz | CX=Bytes pro Zeichen DL=Anzahl der Bildschirmzeilen ES=Segmentadresse der Zeichentabelle BP=Offsetadresse der Zeichentabelle | EGA, VGA, PS/2 | Informationen über einen Zeichensatz, dessen Code Sie in BH übergeben haben folgt am Ende dieser Tabelle. |
12h | 10h | EGA - Konfiguration ermitteln | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
12h | 20h | alternative Hardcopy - Routine aktivieren | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
12h | 30h | Anzahl der Bildschirmzeilen (Scan - Lines) festlegen | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
12h | 31h | Laden der Standard-Palette | AH=12h BL=31h AL=Modus (0: automatisches Laden erlauben; 1: dto. verbieten) | AL=12h | VGA, PS/2 | Legt fest, ob bei der Umschaltung des Videomodus mit Funktion 00h die Palettenregister mit den Standardwerten geladen werden. |
12h | 32h | Zugriff auf Video - RAM | AH=12h BL=32h AL=Modus (0: erlauben; 1: verbieten) | keine | VGA, PS/2 | Legt fest, ob der CPU ein Zugriff auf das Video - RAM oder Hardware - Register gestattet wird. |
12h | 33h | Automatische Grau-Umwandlung der DAC - Farbregister an- / ausschalten | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
12h | 34h | Cursor - Emulation an- / ausschalten | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
12h | 36h | Bildschirm dunkelschalten | AH=12h BL=36h AL=Modus (0: Bildschirm an; 1: Bildschirm aus) | keine | VGA, PS/2 | Ermöglicht es, den Bildschirmaufbau zu unterdrücken und damit den Bildschirm dunkelzuschalten. |
13h | - | Textausgabe | AH=13h AL=Modus BL=Attribut BH=Bildschirmseite CX=Anzahl Zeichen DH=Zeile DL=Spalte ES=Segmentadresse des Puffers BP=Offsetadresse des Puffers | keine | EGA, VGA, PS/2 | Gibt eine Zeichenkette entsprechend dem in AL gesetzten Modus (unter dieser Tabelle) aus. Steuercodes werden interpretiert. Der Bildschirm wird bei Bedarf automatisch gerollt. |
14h | - | reserviert | - | - | - | - |
15h | - | reserviert | - | - | - | - |
16h | - | reserviert | - | - | - | - |
17h | - | reserviert | - | - | - | - |
18h | - | reserviert | - | - | - | - |
19h | - | reserviert | - | - | - | - |
1Ah | 00h | Primären und sekundären Video - Adapter ermitteln | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
1Ah | 01h | Primären und sekundären Video - Adapter einstellen | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
1Bh | - | Statusinformationen über den Video-Modus und das VGA-BIOS einholen | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
1Ch | 00h | Größe der Save - Area abfragen | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
1Ch | 01h | Video - Status sichern | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
1Ch | 02h | Video - Status restaurieren | ??? | ??? | ??? | Zu dieser Funktion standen leider nicht genügend Informationen zur Verfügung. |
Code | Bedeutung |
00h | Zeichensatz von Interrupt 1Fh |
01h | Zeichensatz von Interrupt 43h |
02h | 8*14 - ROM -Zeichensatz |
03h | 8*8 - ROM -Zeichensatz (ASCII 00 - 7Fh) |
04h | 8*8 - ROM -Zeichensatz (ASCII 80 - FFh) |
05h | 9*14 - ROM -Zeichensatz |
06h | 8*16 - ROM -Zeichensatz |
07h | 9*16 - ROM -Zeichensatz |
Modus | Bedeutung |
0 | Cursorposition wird nicht aktualisiert, BL wird als Attribut verwendet. |
1 | Cursorposition wird aktualisiert, BL wird als Attribut verwendet. |
2 | Cursorposition wird nicht aktualisiert, das Attribut jedes Zeichens ist im Puffer enthalten. |
3 | Cursorposition wird aktualisiert, das Attribut jedes Zeichens ist im Puffer enthalten. |
Alle Angaben ohne Gewähr.