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.