AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Kleine Funktion zum Auslesen des Trap-Flag-Status
Thema durchsuchen
Ansicht
Themen-Optionen

Kleine Funktion zum Auslesen des Trap-Flag-Status

Ein Thema von BUG · begonnen am 6. Aug 2006 · letzter Beitrag vom 26. Aug 2006
Antwort Antwort
Benutzerbild von BUG
BUG
Registriert seit: 4. Dez 2003
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
Angehängte Dateien
Dateityp: zip gettrap_175.zip (112,6 KB, 10x aufgerufen)
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
 
Benutzerbild von himitsu
himitsu
Online

 
Delphi 12 Athens
 
#2
  Alt 23. Aug 2006, 13:39
Sieht schon irgendwie schlimmt aus, dieser Pascal-ASM-Mischmasch

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 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.

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.


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.
Miniaturansicht angehängter Grafiken
trap_816.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG
 
#3
  Alt 26. Aug 2006, 18:13
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 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