Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Kleine Funktion zum Auslesen des Trap-Flag-Status (https://www.delphipraxis.net/74622-kleine-funktion-zum-auslesen-des-trap-flag-status.html)

BUG 6. Aug 2006 17:23


Kleine Funktion zum Auslesen des Trap-Flag-Status
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Ich habe ein kleines Beispiel-Programm geschreiben,
das den Trap-Flag des Prozessors ausliest und damit feststellen kann,
ob es im Einzelschrittmodus läuft.

Hier ist die Funktion die den Flag ausliest:

Delphi-Quellcode:
function getTrap: boolean; export;
var temp: longint;
begin
     asm
        Push EAX
        PushF
        Mov EAX, $0
        Pop AX
        Mov temp, EAX
        Pop EAX
     end;
     result := ((temp and $100) > 0);
end;
Sie ist in der Unit detectTrap.pas enthalten.

In meinem Delphi-internen Debugger funktioniert es,
bei anderen auch?

mfg Bug

himitsu 23. Aug 2006 13:39

Re: Kleine Funktion zum Auslesen des Trap-Flag-Status
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sieht schon irgendwie schlimmt aus, dieser Pascal-ASM-Mischmasch :shock:

Wieso nicht gleich mal so?
Delphi-Quellcode:
function getTrap: boolean;
asm
  PUSHF
  POP AX
  MOV AL, AH // oder XCHG AH, AL
  AND AL, $01
end;

// oder
function getTrap: boolean;
asm
  PUSHF
  POP AX
  TEST AX, $0100
  SETNLE AL
end;
Und warum verwendest du EXPORT in einem 32-Bit-Programm?
Mal abgesehn davon, daß es seit Delphi 2 keinerlei Funktion mehr hat.
So alt siehst du nicht gerade aus, daß du mit 'nem Delphi 1, oder einer anderen 16-Bit-Sprache angefangen hast.


Zitat:

Zitat von BUG
Ich habe ein kleines Beispiel-Programm geschreiben,
das den Trap-Flag des Prozessors ausliest ...

In meinem Delphi-internen Debugger funktioniert es,
bei anderen auch?

Ja, es funktioniert immer und überall, nicht nur in Debuggern - das Auslesen dieses Flags. :zwinker:

Aber ob damit sicher getestet werden kann, ob das Programm in einem Debugger läuft, ist 'ne andere Frage,
welche ich jetzt einfach mal mit nein beantworte. :engel:

siehe Bild ... hab das Programm im Delphi-Debugger ausgeführt und was siehst du?
Und nein, ich habe keine Werte im Debugger geändert und es ein ganz einfaches und unverändertes Delphi ... hab nur mal F4 in Zeile 15 angewendet. :mrgreen:


Ach ja, mal zu dem Mischmasch und vorallem wegen der lokalen Variable:

deine Funktion sieht ja eigentlich in etwa so aus
Delphi-Quellcode:
function getTrap: boolean;
var temp: longint;
asm
    Push EBP     // Initialisierung wegen der lokalen Variable "temp"
    Mov EBP, ESP //
    Push ECX     //
    Push EAX
    PushF
    Mov EAX, $0
    Pop AX
    Mov temp, EAX
    Pop EAX
    Test [EBP-4], $0100  // result := ((temp and $100) > 0);
    Setnle AL           //
    Pop ECX // Finalisierung wegen der lokalen Variable "temp"
    Pop EBP //
end;
wie du siehst ... is sie ein bissl größer als man denkt.

Und als kleine Tipps:
In Delphi zählt das Register EAX(AX) nicht gerade zu den Registern, welche unbedingt wiederhergestllt werden müssen ... sie können, also ist ja an deinem Code nichts falsch, aber man könnte es halt weglassen ^^
Zu dem Mov EAX, $0, die unteren 2 Bytes werden ja durch Pop AX überschrieben und die oberen 2 Bytes werden eh in der Abfrage temp and $00000100 nicht ausgewertet
also könnte man deine Mischung schonmal auf dieses reduzieren. :)
Delphi-Quellcode:
function getTrap: boolean;
var temp: longint;
begin
     asm
        PushF
        Pop AX
        Mov temp, EAX
     end;
     result := (temp and $0100) > 0;
end;

function getTrap: boolean;
var temp: longint;
asm
    Push EBP     // Initialisierung wegen der lokalen Variable "temp"
    Mov EBP, ESP //
    Push ECX     //
    PushF
    Pop AX
    Mov temp, EAX
    Test [EBP-4], $0100  // result := (temp and $0100) > 0;
    Setnle AL           //
    Pop ECX // Finalisierung wegen der lokalen Variable "temp"
    Pop EBP //
end;


PS: "Achtung bissig!" is och irgendwie dodal Sinnlos, wenn sich dahinter direkt die Monsterwelt-URL verbirgt. :zwinker:

BUG 26. Aug 2006 18:13

Re: Kleine Funktion zum Auslesen des Trap-Flag-Status
 
Danke für die Verbesserungsvorschläge.

Zu den Export - Befehlen: das steht so in meinem Handbuch (für Delphi 1-6), ich werds mir merken.

Zu dem Pascal-Asm-Mix: stimmt, sieht übel aus, mir sind aber die Aufrufkonventionen von Delphi nicht bekannt und ehe ich tausend Fehler einbaue ...

Zu der Signatur: Stimmt, ich werde sie ändern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz