Entwickler-Ecke

Sonstiges (Delphi) - Inline-Assembler Interrupts


Delete - Fr 24.05.19 01:43
Titel: Inline-Assembler Interrupts
- Nachträglich durch die Entwickler-Ecke gelöscht -


Sinspin - Sa 25.05.19 22:22

Übersetzt Du 32 Bit oder 64?
Was für Interrupts versuchst du auslösen?


Delete - So 26.05.19 00:14

- Nachträglich durch die Entwickler-Ecke gelöscht -


Sinspin - So 26.05.19 10:06

Hmmm, ich habe ein bisschen in meinen Erinnerungen gegraben und im internet.
Zugriff auf Interrupts gibt es nur im real-mode der CPU. Der Modus in DOS Programme laufen. Single threaded.

Int33 ist ein guter bekannter. Für den hatte ich unter DOS ein paar Zeilen um die Maus ordentlich verwenden zu können.

Aber unter Windows kommt man an die Interrupts eigentlich nicht mehr ran. Es sei denn man schreibt einen Treiber.
Probier mal Int 3. Der sollte gehen. Ist der einzige Interrupt der mir einfällt.

Wenn Du was in Assembler machen willst, dann probier mal aus ein Bild um einen bestimmten Winkel zu drehen. Inclusive Sinus Tabelle und Interpolation.
(ist mir klar dass es das schon zigmal gibt, aber an sowas kann man schön sehen wieviel Zeit es spart die Reihenfolge der Befehle zu ändern oder auf andere Befehle / Register auszuweichen)


Delete - Mo 27.05.19 07:14

- Nachträglich durch die Entwickler-Ecke gelöscht -


GuaAck - Mo 27.05.19 09:27

Hallo Frühlingsrolle,

wenn Du ein schönes Beispiel hast, dann stelle es doch mal hier rein, würde mich interessieren.

Für allgemeine Laufzeitfragen kann ich http://www.prodelphi.de empfehlen. Ich habe damit z. B. gefunden, dass ich viel Zeit (25 %!!) mit dem häufigen Umkopieren eines RECORDS verbrauchte, von dem eigentlich nur einige wenige Elemente hätten kopiert werden müssen. Nachteil: Mit Profiler läuft das Programm deutlich langsamer.

Gruß
GuaAck


OlafSt - Di 28.05.19 14:53

Interrupts sind nur im sog. Real Mode des Prozessors möglich. Das ist den alten Prozessoren vor dem 80386 geschuldet, die so liefen.

Mit dem 80386 wurde der Protected Mode eingeführt, der erstmalig richtiges Multitasking (preemptiv, nicht kooperativ wie zuvor) ermöglichte. In diesem Modus werden Interrupts aber völlig anders benutzt (GDT, LDT, IDT). Jeder Versuch, einen Interrupt via INT-Mnemonic zu nutzen führt direkt in einen GPF (General Protection Fault).

Anfangs konnte man noch über das Kommandozeilen-Fenster einen Real Mode erreichen, weil dort tatsächlich noch ein richtiges MS-DOS hinter lag. Das wurde mit XP (IIRC) ebenfalls eliminiert.

Ergo: Geht nicht mehr.


drstar - Mi 29.05.19 11:56

Damit hat nicht XP Schluß gemacht, sondern die NT-Schiene an sich. Bereits unter Win 2000 war die Verwendung der Interrupts so nicht mehr möglich - zumindest nicht im Inline-Assembler. Umgehen konnte man dies, indem man den INTR-Befehl nutzte, Delphi generierte daraufhin selbstmodifizierenden Code, der offenbar auch die Deskriptoren mit eingebunden hatte. So konnte man immer noch den Int33 beispielsweise nutzen. Performant war das Ganze zwar nicht, aber es ging. Ob das heute noch geht, entzieht sich meiner Kenntnis.