![]() |
Delphi -> Assembler -> Interrupt
hi Leute,
bin dabei Assembler in Delphi zu lernen. Habe ein kleines einfaches Programm gemacht, welches die Maus abfragt. Nur bei Interrupt bekomme ich eine Fehlermeldung: procedure TForm1.Maus_an; asm mov ax, 01h int 33h end; Im Projekt ist eine Exception der Klasse $C0000005 mit der Meldung 'Zugriffsverletzung bei 0x005b4b64; Lesen von Adresse 0xffffffff aufgetreten' Habe Windows 7 und XE5 Abgesicherter Modus habe ich schon probiert, bringt nix. Hat jemand da Ahnung? Gruß Jürgen |
AW: Delphi -> Assembler -> Interrupt
Ganz einfache Lösung.
Rate mal, was der Fehlercode $C0000005 bedeutet. $C0000005 ($00000005) STATUS_ACCESS_VIOLATION (ERROR_ACCESS_DENIED) Access is denied Diese Interupts gibt es im WinNT nicht mehr, für User-Mode-Programme. Damals, als noch DOS, Win31 oder Win9x ... aber ist schon lange her. |
AW: Delphi -> Assembler -> Interrupt
Danke für die Antwort.
Aber wie macht man das in Assembler jetzt? Gruß Jürgen |
AW: Delphi -> Assembler -> Interrupt
Zitat:
Man ruft die entsprechende WinAPI auf (CALL), aber das kann man auch gleich direkt im Pascal machen. ![]() |
AW: Delphi -> Assembler -> Interrupt
danke,
wird wohl nix mit Assembler in Delphi. Gruß Jürgen |
AW: Delphi -> Assembler -> Interrupt
Hmm..
Zitat:
Die Zugriffsbeschränkung kommt vom Betriebssystem, hier somit von Windows.. Egal welchen Compiler Du hier nimmst, es wird auch damit diesen Fehlercode geben. Wenn Du also unbedingt direkt mit Interrupts arbeiten möchtest, dann musst Du dir ein anderes Betriebssystem nehmen, wo der direkte Zugriff gestattet ist. |
AW: Delphi -> Assembler -> Interrupt
Zitat:
Du kannst dir ja Beispiele aus diesem Jahrtausend suchen. ;-) Du kannst z.B. auch einfach mal kleine Funktionen schreiben, einen Haltepunkt setzen und wenn du dort ankommst einfach mal ins CPU-Fenster schauen wie dazu der Assemblercode aussieht. (Strg + Alt + C oder Ansicht --> Debug-Fenster --> CPU-Fenster --> CPU) |
AW: Delphi -> Assembler -> Interrupt
Zitat:
Siehe z.B. hier: ![]() Zitat:
Unter Windows erreicht man Effizienz durch Verwendung von DirectX oder OpenGL oder ähnliche APIs oder spezielle Sound-APIs die niedrige Latenz ermöglichen, wie ASIO oder WASAPI, etc. Assembler ist nicht an sich schneller oder näher an der Hardware. Compiler erzeugen auch Maschinencode, nur manchmal ist er suboptimal. Wenn es darum geht eine API-Funktion oder Interrupt aufzurufen ist es eher unwahrscheinlich dass beim Aufruf groß Latenz dazukommt. Allerdings kannst du Windows-APIs (oder andere C-APIs wie sie heute üblich sind) auch per Assembler aufrufen. Dafür musst du nur die Calling-Convention kennen. Ich habe hier mal ein einfaches Beispiel für ![]()
Code:
Wenn man statt "lea eax, [p]" "mov eax, 0" schreibt, wird er "Fail" ausgeben, weil man nun einen Null-Pointer übergeben hat. Der Code funktioniert nur für 32-Bit Windows, die calling convention unter Win64 ist anders.
procedure Success;
begin ShowMessage('Success'); end; procedure Fail; begin ShowMessage('Fail'); end; procedure DoSomethingInAssembler; var p: TPoint; asm // load address of p in eax and push it onto the stack lea eax, [p] push eax // GetCursorPos expects its TPoint parameter to be on the stack (stdcall convention) call GetCursorPos // boolean result returned in eax cmp eax,0 // jump to fail if eax=0 je @@fail // show message 'success' if eax=1 call Success jmp @@exit @@fail: call Fail @@exit: end; procedure TForm1.FormCreate(Sender: TObject); begin DoSomethingInAssembler; end; Das nur als kleines Beispiel. Falls noch nicht bekannt, Strg+Alt+C zeigt das CPU-Fenster (während dem Debuggen), wo man die Assembler-Instruktionen sehen kann, die dem Pascal-Code entsprechen. Assembler ist wirklich nur selten sinnvoll heutzutage, um den Compiler zu überzeugen einige umständliche Konstrukte zu vermeiden, oder ungewöhnliche calling conventions zu unterstützen oder sonstige Hacks. In seltenen Fällen um SIMD-Instruktionen zu verwenden, falls der Compiler sie nicht unterstützt. Aber auch da gibt es normalerweise bessere Lösungen wie z.B. OpenCL. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz