|
|
||
|
|
||
| Assembler | ||
| .. die Softwareinterrupts | ||
|
|
||
|
Der Begriff Interrupt
meint normalerweise eine Unterbrechungsanforderung der
Prozessortätigkeit, in einem gerade laufenden Programm.
Solche Unterbrechungen können durch die CPU oder ein
externes Hardwaresignal IRQ oder NMI hervorgerufen werden.
Bei den Softwareinterrupts des 80x86 handelt es sich nicht um Unterbrechungs-anforderungen durch einen Signalpegel, sondern eher um indirekte Sprünge in ein Unterprogramm. Derartige Sprünge werden bei der 80x86 CPU durch die CPU, Unterbrechungsanforderungen der Hardware oder durch den Maschinenbefehl INT x ausgelöst. Da bei diesem Befehl das INT, nach Intels Sprachregelung, für Interrupt steht, kommt es häufig zu Missverständnissen zwischen dem was man die Quelle einer Unterbrechung nennen könnte, also dem Interrupt-Signal, und der Reaktion auf dieses, dem Sprung in eine Interrupt-Behandlungssoftware, der durch den INT-Prozessorbefehl eingeleitet wird. Das folgende Bild zeigt, beginnend mit der Adresse 00000 (= 0000:0000 in der Segment:Offsetschreibweise), die ersten Speicherzellen des Hauptspeichers einer Intel 80x86 CPU. Die Speicherzellen sind jeweils ein Byte groß und es wurde ihnen ein Inhalt zugeordnet. Die Speicherzelle mit der Adresse 0000:0000 enthält beispielsweise die Zahl 86h Jeweils vier dieser ein Byte großen Speicherzellen enthalten die Adresse eines Unterprogramms. Im Fall des Softwareinterrupts 0 (int 00h) lautet die Adresse 02E4:5186. Man spricht bei dieser Adresse von einem Softwareinterrupt-Vektor. |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
Die RAM-Speicher 0 bis 1023 im
Hauptspeicher einer 80x86 CPU
Wie gross auch immer der Speicherausbau
eines PC's mit der 80x86 CPU sein mag, die Speicherbytes 0 bis
1023 (0-3FFh) gehören dem Maschinenbefehl INT x. Sie
sollten von einem Systemdesigner nicht anderweitig benutzt worden
sein. In diesen Bytes können 256 Adressen zu je 20 Bit
abgelegt werden, wozu man, bei der bereits geschilderten
Adressbildung der 80x86 CPU, zwei Worte oder vier Bytes benötigt
(4256 = 1024).
Die Adressen sind in einen Segmentanteil
und einen Offsetanteil zerlegt. Sie sind, wie oben im Bild
gezeigt, in der folgenden Abfolge abgelegt ..
Low / High Byte d. Offsetadresse, dann Low / High Byte d. Segmentadresse Im Beispiel des Bildes ergibt sich aus den Speicherinhalten der Bytespeicher 0, 1, 2, 3, die 86h, 51h, E4h, 02h enthalten, die Adresse 02E4: 5186. In der Speicherzelle mit dieser Adresse des Hauptspeichers beginnt also ein Unterprogramm. |
||
|
Der Softwareinterrupt int x
Bei
dem Prozessorbefehl INT
x,
steht das x für eine Zahl zwischen 0 und 255 (FFh). Wird
dieser Befehl durch die CPU ausgeführt, so ruft sie das
Unterprogramm auf, dessen Adresse in dem x 4ten
Speicherbyte und den drei folgenden, genannt wird. Man nennt dies
einen indirekten Sprung. Das aufgerufene
Softwareinterrupt-Unterprogramm seinerseits endet mit dem Befehl
Return from Interrupt (IRET),
und es kehrt, nachdem es durchlaufen wurde, zu dem
Maschinenbefehl zurück, der dem INT x Befehl folgt.
Der Befehl IRET unterscheidet sich von dem
RET-Befehl eines normalen Rücksprungs aus einem
Unterprogramm nur dadurch, das er vor dem Rücksprung das
gesicherte Flaggenregister der CPU wieder herstellt. Diese beiden
Eigenschaften, der indirekte Aufruf des Unterprogramms und der
Rücksprungbefehl IRET unterscheiden das
Softwareinterruptprogramm von einem normalen Unterprogrammaufruf
durch CALL.
Vom
Grundsatz her also nicht viel neues.
Im Beispiel des Bildes oben wird durch den Befehl INT 0 das Unterprogramm aufgerufen, welches an der Adresse 02E4:5186 beginnt, .. denn 0 4 = 0. Dem obigen entsprechend werden die Speicherzellen 0,1,2,3 benutzt. Der Befehl INT 1 würde das Unterprogramm aufrufen, das in der Speicherzelle 0070:0C62 beginnt. Der Grund, .. 1 4 = 4 und dementsprechend werden die Inhalte der Speicher 4,5,6,7 zur Adressbildung benutzt. INT 2 benutzt wegen 2 4 = 8 die Speicherzellen 8,9,A,B, in denen die Adresse 0170:01A5 vermerkt ist. |
||
|
|
|
|
|
Der eigentliche Wert des indirekten
Unterprogrammausrufs durch INT x liegt darin, dass die
Architektur der 80x86 CPU, 256 Einsprungstellen zu
Unterprogrammen erzwingt, an denen kein Softwareentwickler
vorbeikommt.
Angenommen man hat sich geeinigt, dass der Befehl INT 70h auf das Treiberprogramm für einen Drucker zeigt, so wird ein Anwendungsprogrammierer in seinem Programm mit dem Befehl INT 70h den Druckertreiber aufrufen. In welchem Teil des Betriebssystems und an welcher konkreten Adresse der Treiber im BIOS, DOS, bei UNIX, LINUX oder Windows tatsächlich zu finden ist und welche Hardware für den Drucker notwendig ist, mussihn nicht mehr interessieren. Der Programmierer eines neuen BIOS für einen neuen PC seinerseits tut gut daran, in den 4 Adressbytes für den Interrupt 70h die Adresse des Treiberprogramms dieses Druckers einzutragen. Tut er das nicht, so würden viele ältere Anwenderprogramme nicht mehr laufen und kaum jemand würde sein neues Motherboard mit dem neuen BIOS kaufen. Ein Beispiel bei dem sich dies ebenfalls gut nachvollziehen lässt, sind die Videokarten. Der Anwender geht davon aus, dass seine Programme mit jeder der vielfältigen und unterschiedlichen Videokarten gleichermaßen gut läuft. Er steckt seine neue Videokarte in den Slot seines Rechners, installiert den Treiber und alles funktioniert. Der Grund hierfür, liegt wiederum darin, dass die Anwenderprogramme grundsätzlich einen bestimmten Softwareinterrupt aufrufen, wenn Sie Ausgaben zum Bildschirm machen wollen. Der Hersteller der Videokarte wird die Adresse seines Treiberprogramms, das die Besonderheiten der Karte verfügbar macht, sinnvollerweise in den vier Bytespeichern des gleichen Softwareinterrupts eintragen, da er andernfalls die Anwendungsprogramme lahm legt, und er somit keine Videokarte verkaufen wird. Auf welche Adresse sein Treiber beim Start des Computersystems nun tatsächlich geladen wird, interessiert durch den Aufruf des Treibers über den Soft-INT niemand mehr. Wichtig ist nur, dass der Treiber bei seinem Start, seine Adresse in den Soft-INT einträgt. |
||
|
|
.de