Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.360 Beiträge
 
Delphi 12 Athens
 
#2

Re: Kleine Funktion zum Auslesen des Trap-Flag-Status

  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  
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat