Übung 5

Aufbau einer Interrupt-Service-Routine

  • Aufruf erfolgt über ein Registerpaar (Segment- und Offset-Adresse)
  • Werte werden in die Interrupt-Vektor-Tabelle eingetragen

Eine Interrupt-Vektor-Tabelle enthält also die Startadressen der Interrupt-Service-Routinen (ISR). Sie kann von überall aufgerufen werden.

isr_nameproc far
.
.
.
iret
isr_nameendp

Die ISR wird mit Befehl 'iret' verlassen. Der Stack enthält als oberste Keller-Elemente

  • Statusregister,
  • Codesegment-Register (CS) und
  • Instruction Pointer (IP).

Diese obersten drei Keller-Elemente werden vom Keller abgeholt und entsprechend zugewiesen. Die Abarbeitung des Programms erfolgt an der durch CS:IP bestimmten Stelle (normalerweise an der den Interrupt auslösenden Befehl folgenden Adresse).

Interrupt-Maskierung (Sperrung)

Beim Einsprung in die ISR wird automatisch das I-Flag = 0 gesetzt, d.h., alle weiteren maskierbaren Interrupts sind gesperrt.

Arten von Interrupts

  • Hardware-Interrupts
    • NMI
    • INTR
  • Software-Interrupts
    • INTO
    • INT n
  • prozessorinterne Interrupts
    • Division durch 0
    • Einzelschritt-Betrieb
  • bei DOS außerdem noch belegt
    • BIOS-Interrupts
    • DOS-Interrupts

Aufbau der Interrupt-Vektor-Tabelle (am Anfang des Programmspeicherbereichs)

AdresseInterrupt
03FC255
..
..
..
14INT5
10INTO
000CINT3
8NMI
4Einzelschritt
0Division durch 0

Aufbau eines Eintrages

n+3CS-high
n+2CS-low
n+1IP-high
n+0IP-low

Sollen in der ISR weitere maskierbare Interrupts zugelassen werden, muß das I-Flag = 1 gesetzt werden (mit Befehl sti).

Eintragen/Lesen des Interrupt-Vektors in der Interrupt-Vektor-Tabelle

  • Direkt Adressen lesen/schreiben im Programmspeicher
  • Mit DOS-Interrupt 25h Interrupt-Vektor setzen, wobei al = Interrupt-Nummer und ds:dx = Adresse der ISR sind. Beispiel:

push ds
mov ax, cs
mov ds, ax
mov dx, offset isr_name    ;jetzt steht in ds:dx die Adresse der ISR
mov ah, 25h
mov al, 100                        ;Int.-Nummer 100 als Beispiel
int 21h
pop ds

  • Mit DOS-Interrupt 35h Interrupt-Vektor lesen, wobei al = Interrupt-Nummer und es:bx = Adresse der ISR sind.

Arbeit mit Bibliotheken

Bibliotheken sind Sammlungen von Objektmodulen (name.obj). Die Verwaltung übernimmt das  Dienstprogramm TLIB (in Verzeichnis 8086 auch enthalten!). Mit TLIB wird die Bibliothek erzeugt und Module werden hinzugefügt oder gelöscht. Achtung: Im Seminar ist die Bibliothek bereits erzeugt und heißt BIB1.

Aufruf:    TLIB    BIB1.LIB +/-mosul.obj

Ablauf:    name.asm ???name.obj in BIB1 schaffen

Beim Linken wird BIB1 automatisch mit angehangen, weil in 8086.bat steht:

    TLINK /v %1.obj,,,bib1

Konsequenzen für den Programmaufbau

Beispiel-Prozedur Bs (Bildschirm löschen) - soll in BIB1

.model tiny
.code
    public bs    ;Name bs als öffentlich erklären
    locals @@
bs    proc near
    .        ;bs.asm->bs.obj->in BIB1 schaffen
    .
    .
    ret
bs    endp
end
-------------------------------------
.model small
.stack
.data
.code
    extrn bs:near    ;bs externe prozedur
    .        ;b1.asm->b1.obj->TLINK(mit BIB1)->b1.exe
    .
    .
    call bs
    .
    .
    .
    mov ax, 4C00h
    int 21h
    end

1. Interrupt-Handler schreiben (Software-Interrupt)

Ziele: Kennenlernen, wie man eine Interrupt-Service-Routine schreibt und das Eintragen der Anfangsadresse der ISR in die Interrupt-Startadressen-Tabelle.

Schreiben Sie ein Programm (Hauptprogramm), das mit Hilfe des Befehls INT 100 (dezimal!) eine Interrupt-Routine aufruft. In der Interrupt-Routine soll der gesamte Hauptregistersatz einschließlich der Index- und Pointer-Register auf dem Bildschirm angezeigt werden. Der Bildschirmtext soll solange angezeigt werden, bis die Enter-Taste gedrückt wird. Damit soll die Interrupt-Routine beendet und in das Hauptprogramm zurück gesprungen werden.

Vor der Auslösung des Software-Interrupts muß allerdings erst noch die Anfangsadresse der Interrupt-Routine in die Interrupt-Startadressen-Tabelle eingetragen werden.

Vereinbaren Sie die Interrupt-Routine mit dem far-Attribut.

2. Einbindung von Objekt-Code-Modulen, die in einer Bibliothek stehen

Eine Routine, die den Bildschirm löscht und den Cursor setzt, soll  in die Bibliothek bib1 eingefügt werden. Dazu ist die Prozedur als public zu deklarieren.

Nach dem Assemblieren ist der Objekt-Code mit dem Dienstprogramm TLIB in die Bibliothek bib1 einzufügen.

Das Hauptprogramm soll diese externe Prozedur aufrufen und danach die Tastatur abfragen. Wenn die RETURN-Taste gedrückt wurde, soll das Programm beendet werden.

keyboard_arrow_up