Interrupts in Inline Assembler

03/22/2011 17:56 HardCore.1337#1
Hey :cool:

ich bin heute auf etwas merkwürdiges Gestoßen. Es geht um Interrupts in Inline Assembler. Folgender Code mit einer Zugriffsverletzung beendet. Ist es möglich das gar keine Interrupts in Inline Assembler unterstützt werden oder ich habe ich einen Fehler gemacht?

Code:
void MoveMouse()
{
   _asm
   {
       mov ah, 0x04;
       mov cx, 500; // X
       mov dx, 1000; // Y
       int 0x33; //das scheint nicht zu gehen

   }
}
03/22/2011 18:06 Akorn#2
Für welches betriebssystem ist den das pogramm.
03/22/2011 18:08 HardCore.1337#3
Hab es unter Win7 x64 getestet.
03/22/2011 18:16 MrSm!th#4
In Inline ASM gehen natürlich alle Befehle genau so, als würde man sie direkt mit einem Assembler assemblieren, aber was ich mich gerade frage:

Was macht der Interrupt? Ist er überhaupt vom System zugelassen? Soweit ich weiß, gibt es einige, die das System nicht zulässt.
Oder wird einer der Werte, die du angegeben hast, als Speicheradresse verwendet?
03/22/2011 18:16 Akorn#5
Interrupt 0x33 ist ein Interrupt das vom BIOS bereitgestellt wird. Es ist eigentlich nur für Realmode Betriebssysteme gedacht und funktioniert nicht auf betriebssyteme die protectmode bzw bei X64 im Longmode laufen.

Die BIOS interrupt haben früher zusammen mit dem DOS interrupts unter den Betreibssystem DOS die Pogrammier API Dargestellt.

Unter Windows wirst du ein pogramm dass interrupts benutzt nur noch emuliert ausführen können.
Der NT-Kernel von Windows stellt nur noch einen Interrupt berreit undzwar den 0x2e dieser wird aber nur von der ntdll als verbindungsglied zwischen Usermode und Kernelmode benutzt. Wobei es mittlerweile andere verfahren gibt um aus dem Usermode mit dem kernel im kernelmode zu kommunizieren. wodurch auch dieser interrupt immer mehr verschwindet.
03/22/2011 18:24 HardCore.1337#6
Quote:
Originally Posted by Akorn View Post
Interrupt 0x33 ist ein Interrupt das vom BIOS bereitgestellt wird. Es ist eigentlich nur für Realmode Betriebssysteme gedacht und funktioniert nicht auf betriebssyteme die protectmode bzw bei X64 im Longmode laufen.

Die BIOS interrupt haben früher zusammen mit dem DOS interrupts unter den Betreibssystem DOS die Pogrammier API Dargestellt.
Ja, davon habe ich auch schon gelesen, das der 0x33 Interrupt noch aus DOS Zeiten stammt. Ich werde es mal unter Win98 testen. Aber wenn ich weiß das Interrupts allgemein gehen wäre ich schon sehr erleichtert
03/22/2011 18:40 Akorn#7
Quote:
Originally Posted by HardCore.1337 View Post
Ja, davon habe ich auch schon gelesen, das der 0x21 Interrupt noch aus DOS Zeiten stammt. Ich werde es mal unter Win98 testen. Aber wenn ich weiß das Interrupts allgemein gehen wäre ich schon sehr erleichtert
Habe in meinen letzten post noch was hinzugefügt da ich nicht gesehn hab das du berreits zurückgeschrieben hast.

32Bit windows systeme haben einen Emulator der es erlaubt pogramme die den Interupt 0x21 benutzen auszuhfüren.
Ansonsten kannst du halt nur den Interrupt 0x2e benutzen. Damit kannst du aber schon ne menge machen da schliesslich die komplette Kernel32.dll auf diesen interrupt aufbaut. Allerdings wirst du keinerlei dokummentationen über die funktionen dieses Interrupts finden.

Ansonsten wen du umbedingt mit Interrupts arbeiten willst dan kannst du auch Linux nehmen. Der Linux kernel stellt nämlich alle seine funktionen als interrupt 0x80 berreit. Oder du nimmst das BS MenuetOs das stellt seine API auch nur als interrupt berreit.
03/22/2011 18:45 HardCore.1337#8
Ok, hätte nicht gedacht das es so kompliziert wird :(
03/22/2011 19:10 MrSm!th#9
Quote:
Originally Posted by Akorn View Post
Habe in meinen letzten post noch was hinzugefügt da ich nicht gesehn hab das du berreits zurückgeschrieben hast.

32Bit windows systeme haben einen Emulator der es erlaubt pogramme die den Interupt 0x21 benutzen auszuhfüren.
Ansonsten kannst du halt nur den Interrupt 0x2e benutzen. Damit kannst du aber schon ne menge machen da schliesslich die komplette Kernel32.dll auf diesen interrupt aufbaut. Allerdings wirst du keinerlei dokummentationen über die funktionen dieses Interrupts finden.

Ansonsten wen du umbedingt mit Interrupts arbeiten willst dan kannst du auch Linux nehmen. Der Linux kernel stellt nämlich alle seine funktionen als interrupt 0x80 berreit. Oder du nimmst das BS MenuetOs das stellt seine API auch nur als interrupt berreit.
Funktionieren die Calls in den Kernel nicht mittlerweile per SYSENTER?
03/22/2011 23:42 Akorn#10
Quote:
Originally Posted by MrSm!th View Post
Funktionieren die Calls in den Kernel nicht mittlerweile per SYSENTER?
Ja das wird immer öfters als Sysenter gemacht,das hatte ich aber auch angedeutet.

Quote:
Originally Posted by Akorn View Post
Der NT-Kernel von Windows stellt nur noch einen Interrupt berreit undzwar den 0x2e dieser wird aber nur von der ntdll als verbindungsglied zwischen Usermode und Kernelmode benutzt. Wobei es mittlerweile andere verfahren gibt um aus dem Usermode mit dem kernel im kernelmode zu kommunizieren. wodurch auch dieser interrupt immer mehr verschwindet.
03/23/2011 11:57 HardCore.1337#11
Find ich aber relativ schade das die Interrupts verschwinden :(
03/23/2011 13:03 Akorn#12
Nunja auf anderen Betriebssystemen gibt es ja noch Interrupts.
Und rein theoretisch kannst du auch kernel funktionen mittels Sysenter von deinem programm aus aufrufen, das ist aber weitaus schwieriger da nicht jede Cpu sysenter unterstützt und das benutzen von Sysenter sich auf Intel und Amd Cpu´s unterscheidet.
03/23/2011 15:49 MrSm!th#13
Warum schade? Gibt nunmal nun bessere Varianten.
Was haben die Interrupts, was andere Methoden nicht haben?

Ob du nun Ausgabefunktionen callst oder den Ausgabe-Interrupt auslöst, ist doch ziemlich egal. Und Sprünge in den Kernel passieren wie gesagt nun per SYSENTER.

Schreib doch dein eigenes Betriebssystem, dann kannst du die Interrupt-Table sogar selbst festlegen :P