Autor Beitrag
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Di 25.01.05 18:39 
hoi, ich versuche grade mir ein paar Assemblerskills beizubringen und da dachte ich mir, ein guter Start wären z.b. Funktionsaufrufe mal nicht wie gewohnt, sondern per assembler auszuführen... dabei haben sich gleichmal ein paar fragen aufgeworfen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button2Click(Sender: TObject);
  var test:string;
  addr : pointer;
  add2: dword;
begin
  test:='bla bla';
  addr := @test;
  add2 := dword(addr);
//  showmessage(test);
  asm
//   mov eax, offset[test];
//   mov eax, add2;
   mov eax, DWORD PTR[test];
   call showmessage;
  end;
end;

mit add2 hole ich mir zb. den DWORD-Wert, der dem Zeiger auf den String entspricht.
sonderbarerweise liefert der Aufruf mov eax, add2; im CPU-Fenster folgendes zurück: mov eax, [ebp-$04]
der aufruf von mov, eax DWORD PTR[test]; liefert hingegen mov eax, [ebp-$08], was dem üblichen aufruf mit Showmessage(test) entspricht.
mov eax, offset[test] hingegen liefert ein mov eax, $FFFFFFFC ...
aus meiner logik müssten eigentlich alle 3 aufrufe das selbe tun.

mov eax, [ebp-$08]: was genau passiert hier mit dem wert in EBP (und was steht da drin)?

letzte frage: kennt jemand ein gutes ASM-Tut, wo befehle wie LEA, XOR, SHL, SHR, STOSD usw erklärt werden ?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 25.01.05 21:31 
Als erstes, bevor ich die Fragen gleich aufkläre möchte ich Dir einen gutgemeinten Tipp geben:
Lass bei ASM die Finger von Strings und allen anderen Konstrukten mit Referenzzähler. Damit handelst Du Dir nur Probleme ein.

retnyg hat folgendes geschrieben:
hoi, ich versuche grade mir ein paar Assemblerskills beizubringen und da dachte ich mir, ein guter Start wären z.b. Funktionsaufrufe mal nicht wie gewohnt, sondern per assembler auszuführen...


Für den Anfang würd ich empfehlen mit Records, Pointern und Ordinal-Zahlen zu arbeiten. Macht bei ASM den wenigsten Verwaltungsaufwand:

retnyg hat folgendes geschrieben:
dabei haben sich gleichmal ein paar fragen aufgeworfen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button2Click(Sender: TObject);
  var test:string;
  addr : pointer;
  add2: dword;
begin
  test:='bla bla';
  addr := @test;
  add2 := dword(addr);
//  showmessage(test);
  asm
//   mov eax, offset[test];
//   mov eax, add2;
   mov eax, DWORD PTR[test];
   call showmessage;
  end;
end;


@Test gibt den Zeiger auf die Deklaration von Test zurück, dazu dann noch später mehr ...

retnyg hat folgendes geschrieben:
mit add2 hole ich mir zb. den DWORD-Wert, der dem Zeiger auf den String entspricht.
sonderbarerweise liefert der Aufruf mov eax, add2; im CPU-Fenster folgendes zurück: mov eax, [ebp-$04]
der aufruf von mov, eax DWORD PTR[test]; liefert hingegen mov eax, [ebp-$08], was dem üblichen aufruf mit Showmessage(test) entspricht.


Das ist aber auch eindeutig, warum die der fall ist, da Add2 und test zwei verschiedene Variablen sind.
Sauber geschriebener ASM sähe für deine Anweisungen so aus:
mov eax, add2
ausblenden Delphi-Quelltext
1:
MOV EAX, DWORD PTR [add2]					

mov, eax DWORD PTR[test]
ausblenden Delphi-Quelltext
1:
MOV EAX, DWORD PTR [test]					

Wie hier eindeutig erkennbar ist, greifen diese Anweisungen also auf zwei verschiedene Speicherbereiche zu ... Daher die unterschiedlichen EBP-Offsets (siehe weiter unten)

retnyg hat folgendes geschrieben:
mov eax, offset[test] hingegen liefert ein mov eax, $FFFFFFFC ...
aus meiner logik müssten eigentlich alle 3 aufrufe das selbe tun.

Die Anweisung MOV EAX, OFFSET[Test] liefert nun das Offset von Test im Speicher, nicht, wie die vorherigen Anweisungen, den Wert, der in dieser Speicherzelle steht.

retnyg hat folgendes geschrieben:
mov eax, [ebp-$08]: was genau passiert hier mit dem wert in EBP (und was steht da drin)?

EBP ist der Zeiger auf das sogenannte Stackframe, dass vom Compiler angelegt wird, um z.B. deine lokalen Variablen (Pointer, Ords und Records) zu speichern. Diese werden dann relativ im Speicher addressiert.

retnyg hat folgendes geschrieben:
letzte frage: kennt jemand ein gutes ASM-Tut, wo befehle wie LEA, XOR, SHL, SHR, STOSD usw erklärt werden ?

Jip. Die technische Dokumentation zu Deinem Prozessor :P Ansonsten kannst Du Dir ja mal webster.cs.ucr.edu/ an. Dort müsstest Du eigentlich fündig werden...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
retnyg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mi 26.01.05 02:40 
erst mal vielen dank für deine antworten !
ein paar dinge sind mir noch ein bischen unklar:

BenBE hat folgendes geschrieben:

Lass bei ASM die Finger von Strings und allen anderen Konstrukten mit Referenzzähler. Damit handelst Du Dir nur Probleme ein.
Und wenn ich nun einen String brauche ? dann wäre es doch zielführend einen pointer auf diesen String zu verwenden. Oder wie könnte man es sonst machen ?
BenBE hat folgendes geschrieben:

Das ist aber auch eindeutig, warum die der fall ist, da Add2 und test zwei verschiedene Variablen sind.
Sauber geschriebener ASM sähe für deine Anweisungen so aus:
mov eax, add2
ausblenden Delphi-Quelltext
1:
MOV EAX, DWORD PTR [add2]					

wie schaffe ich es dann dem MOV EAX den Wert der in Add2 gespeichert ist, mitzugeben ?

BenBE hat folgendes geschrieben:

Die Anweisung MOV EAX, OFFSET[Test] liefert nun das Offset von Test im Speicher, nicht, wie die vorherigen Anweisungen, den Wert, der in dieser Speicherzelle steht.
hmm ich dachte das Offset wäre mit dem Pointer ident ^^

BenBE hat folgendes geschrieben:

EBP ist der Zeiger auf das sogenannte Stackframe, dass vom Compiler angelegt wird, um z.B. deine lokalen Variablen (Pointer, Ords und Records) zu speichern. Diese werden dann relativ im Speicher addressiert.
Kann ich mir das so vorstellen, dass das ein 32bit zeiger ist der auf die zuletzt gesetzte variable zeigt, also EBP-$04 die vorletzte variable usw ?

BenBE hat folgendes geschrieben:
Die technische Dokumentation zu Deinem Prozessor :P
Danke für den Tipp, ich habe mir das 854 Seiten umfassende Manual geholt :nut:
minnime
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 171

Win 7
Delphi Prism 2011, C# (VS 2010)
BeitragVerfasst: Mi 26.01.05 09:25 
Wo gibt es denn die technische Dokumentation zu einem Prozessor?
DelphiFreaks
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 26.01.05 09:39 
frag ich mich auch schon die ganze zeit
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mi 26.01.05 09:41 
@Delphifreaks: Doppelposting gelöscht

AXMD
DelphiFreaks
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 26.01.05 09:42 
'schuldigung
retnyg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mi 26.01.05 12:07 
minnime hat folgendes geschrieben:
Wo gibt es denn die technische Dokumentation zu einem Prozessor?

www.intel.com/design...anuals/index_new.htm
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 26.01.05 12:30 
retnyg hat folgendes geschrieben:
BenBE hat folgendes geschrieben:

Lass bei ASM die Finger von Strings und allen anderen Konstrukten mit Referenzzähler. Damit handelst Du Dir nur Probleme ein.
Und wenn ich nun einen String brauche ? dann wäre es doch zielführend einen pointer auf diesen String zu verwenden. Oder wie könnte man es sonst machen ?

Du kannst zwar gern damit arbeiten, ich würd dir aber empfehlen, in einem solchen Fall Phar und die dazugehörigen Funktionen zu nutzen. Mehr kann ich dazu nicht sagen, da ich ASM IMMER nur für Routinen benutze, in denen ich keinerlei Strings benötige, bzw. mische ich Pascal und ASM, wenn es sich nicht anders machen lässt.

retnyg hat folgendes geschrieben:
BenBE hat folgendes geschrieben:

Das ist aber auch eindeutig, warum die der fall ist, da Add2 und test zwei verschiedene Variablen sind.
Sauber geschriebener ASM sähe für deine Anweisungen so aus:
mov eax, add2
ausblenden Delphi-Quelltext
1:
MOV EAX, DWORD PTR [add2]					

wie schaffe ich es dann dem MOV EAX den Wert der in Add2 gespeichert ist, mitzugeben ?

MOV EAD, DWORD PTR [add2] ist der Wert von Add2.

retnyg hat folgendes geschrieben:
BenBE hat folgendes geschrieben:

Die Anweisung MOV EAX, OFFSET[Test] liefert nun das Offset von Test im Speicher, nicht, wie die vorherigen Anweisungen, den Wert, der in dieser Speicherzelle steht.
hmm ich dachte das Offset wäre mit dem Pointer ident ^^

Nein, das Displacement (also die eigentliche Adresse) wird mit
ausblenden Delphi-Quelltext
1:
LEA EAX, [add2]					

berechnet. Das gibt Dir den Pointer auf Add2 in EAX zurück

retnyg hat folgendes geschrieben:
BenBE hat folgendes geschrieben:

EBP ist der Zeiger auf das sogenannte Stackframe, dass vom Compiler angelegt wird, um z.B. deine lokalen Variablen (Pointer, Ords und Records) zu speichern. Diese werden dann relativ im Speicher addressiert.
Kann ich mir das so vorstellen, dass das ein 32bit zeiger ist der auf die zuletzt gesetzte variable zeigt, also EBP-$04 die vorletzte variable usw ?

So in der Art kann man das bezeichnen, wobei sich die Offsets der Variablen nach dem gespeicherten Inhalt richten.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
retnyg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mi 26.01.05 14:22 
BenBE hat folgendes geschrieben:

Du kannst zwar gern damit arbeiten, ich würd dir aber empfehlen, in einem solchen Fall Phar und die dazugehörigen Funktionen zu nutzen.
Meinst du CHAR, also quasi Array of Char ?

retnyg hat folgendes geschrieben:

wie schaffe ich es dann dem MOV EAX den Wert der in Add2 gespeichert ist, mitzugeben ?

BenBE hat folgendes geschrieben:

MOV EAD, DWORD PTR [add2] ist der Wert von Add2.


ich glaube du hast nicht ganz verstanden auf was ich hinauswill. ich habe in Add2 eine Nummer gespeichert. Diese Nummer ist der Pointer auf test (halt nicht als pointer sondern als DWORD deklariert)
wäre diese nummer jetzt z.b. $00124cF8 möchte ich genau diese Nummer, und nicht irgendeinen Zeiger (weil die Nummer ja selber ein Zeiger ist) dem MOV mit auf den Weg geben. Der Compiler soll also nicht MOV EAX [EBP-$04*var_steps_back] draus machen, sondern genau dieses hier: MOV EAX, $00124cF8 - wie bringe ich ihm das bei ?

BenBE hat folgendes geschrieben:

Die Anweisung MOV EAX, OFFSET[Test] liefert nun das Offset von Test im Speicher, nicht, wie die vorherigen Anweisungen, den Wert, der in dieser Speicherzelle steht.
Nein, das Displacement (also die eigentliche Adresse) wird mit
ausblenden Delphi-Quelltext
1:
LEA EAX, [add2]					

berechnet. Das gibt Dir den Pointer auf Add2 in EAX zurück

also macht LEA EAX, [add2] das gleiche wie MOV EAX, DWORD PTR[add2]
was ist dann aber das Offset ? wenn ich das bei verschiedenen Variablen verwende, kommt im compiler schlussendlich doch immer FFFFFFFC raus.
BenBE hat folgendes geschrieben:

retnyg hat folgendes geschrieben:
BenBE hat folgendes geschrieben:

EBP ist der Zeiger auf das sogenannte Stackframe, dass vom Compiler angelegt wird, um z.B. deine lokalen Variablen (Pointer, Ords und Records) zu speichern. Diese werden dann relativ im Speicher addressiert.
Kann ich mir das so vorstellen, dass das ein 32bit zeiger ist der auf die zuletzt gesetzte variable zeigt, also EBP-$04 die vorletzte variable usw ?

So in der Art kann man das bezeichnen, wobei sich die Offsets der Variablen nach dem gespeicherten Inhalt richten.

womit wir wieder beim Offset wären.
also rein theoretisch ist ein Zeiger immer 32bit, also 4 bytes lang. der zeiger auf einen String mit 1000 bytes länge sollte demnach eigentlich auch nur 4 byte länge aufweisen. damit das dann aber mit EBP-$04 und EBP-$08 (ich nehme mal an dass da einfach 4 vom wert in EBP subtrahiert wird) usw funktioniert vermute ich dass EBP auf eine Speicherstelle zeigt, die schlussendlich wieder ein zeiger auf die variable ist.
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 26.01.05 14:42 
wenn du "string" in inlime asm benutzen willst ->

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var blub: string;
begin
  blub := 'elele';
  asm
    mov eax, blub  //kein offset, kein @, dann ist in eax der pointer zu dem string als pchar
    push 0
    push 0
    push eax
    push 0
    call messagebox
  end;
retnyg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mi 26.01.05 15:08 
uall@ogc hat folgendes geschrieben:
wenn du "string" in inlime asm benutzen willst ->

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var blub: string;
begin
  blub := 'elele';
  asm
    mov eax, blub  //kein offset, kein @, dann ist in eax der pointer zu dem string als pchar
    push 0
    push 0
    push eax
    push 0
    call messagebox
  end;


danke für den tip; aber könntest du noch kurz erläutern warum du die nullen auf den stack schmeisst?

Bin übrigens gerade draufgekommen, dass der Wert, der dem Pointer(variable) in Delphi entspricht, nicht direkt die Position der Variable im Speicher ist, sondern vielmehr ein Zeiger auf einen Zeiger. sprich, in dem Pointer steht die Adresse, wo die Adresse des Strings im Speicher drinsteht. irgendwie verwirrend....
DWORD PTR[variable] liefert hingegen den "richtigen" schlussendlichen Pointer.
retnyg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Do 27.01.05 14:22 
Zitat:
also macht LEA EAX, [add2] das gleiche wie MOV EAX, DWORD PTR[add2]

habe mich getäuscht, LEA lädt den Pointer zu dem Pointer in EAX, während MOV den endgültigen Pointer liefert.
wie könnte man nun beispielsweise aus dem wert den LEA zurückliefert, den darin gespeicherten Inhalt (4 byte) auslesen (also genau den wert der normalerweise von MOV geliefert wird) und in EAX reinschreiben?
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Do 27.01.05 15:08 
LEA macht eine berechnung

d.h. du kannst es z.b. so benutzen

ausblenden Delphi-Quelltext
1:
LEA eax, [eax*4]					


bei LEA müssen imemr die eckingen klammern da sein

LEA EAX, [EAX] mach also gar nichts
hingegene würde
MOV EAX, [EAX] die daten die an der adresse in EAX stehen in EAX schreiben (was du wissen wolltest)

also

ausblenden Delphi-Quelltext
1:
2:
 LEA EAX, [add2]
 MOV EAX, DWORD PTR [EAX]


ist das selbe wie:

ausblenden Delphi-Quelltext
1:
 MOV EAX, DWORD PTR [add2]					


wobei man es auch so machen könnte

ausblenden Delphi-Quelltext
1:
2:
 PUSH DWORD PTR [add2]
 POP EAX


oder

ausblenden Delphi-Quelltext
1:
2:
3:
  LEA EAX [add2]
  PUSH [EAX]
  POP EAX


usw. gibt halt genug möglichkeiten ds selbe zu machen
retnyg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Do 27.01.05 15:22 
danke, das hilft mir wirklich weiter !
mich wundert aber immer noch warum du in deinem obigen codebeispiel 4 Push befehle ausführst die eigentlich gar nicht notwendig sind denn
ausblenden Quelltext
1:
2:
   mov eax, test;
   call showmessage;

funktioniert ja auch ^^

edit: autsch - habs grade selber gecheckt
du verwendest messagebox und nicht showmessage :oops:
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Do 27.01.05 15:32 
also

normale delphi prozedure und funktionen die du benutzt haben eigentlich immer folgenden aufbau

procedure blub(a: string); register;

das register muss man aber nicht hinschreiben und sagt eigentlich nur aus das alle parameter in registern übergeben werden

API funktionen haben aber immer einen anderen aufruf

function MessageBoxA(a: integer; b, c: pchar, d: integer): integer; stdcall;

das stdcall sagt aus das die paramter mit dem stack übergeben werden ausserdem werden strings immer als pchar übergeben also einen pointer zu der adresse des strings der mit #0 abegschlossen ist

showmessage ist eine delphi interne anweisung daher musst du den paramter im register übergeben in dem fall EAX

MessageBoxA ist eine API aus der user32.dll und hat den stdcall aufruf
ausserdem hat Messageboxa 4 parameter

also muss man das mit

PUSH 0 (letzer prameter)
PUSH 0 (vorletzer parameter, titelleiste als pchar, bei 0 = nil = nix)
PUSH text (text als pchar, 0 = nil = nix)
PUSH 0 (1. parameter)
CALL...
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Fr 28.01.05 15:37 
hab da mal was gemacht, könnte für mehrere interessant sein :>
www.arschvoll.net/tutxqz.pdf
retnyg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Fr 28.01.05 16:27 
:flehan:

nimmst du noch schüler an ? :mrgreen:
retnyg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: So 30.01.05 16:34 
hmm ich hab da wieder ein problem: bin gerade dabei, die standard Message Handler von Delphi zu debuggen, damit ich rausfinde was delphi macht, dass bei einem klick das darunterligende node eines Treeview selektiert wird.
Leider kommen da massig messages daher, und das debugging ist ziemlich mühsam. drum hab ich mir gedacht, ich baue in die WndProc aus der Classes.pas einen Aufruf ein der mir, wenn die Message 513, also WM_LBUTTONDOWN ist, einen Break setzt (mit INT 3). Sonderbarerweise tritt allerdings meine routine nie in kraft....
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
function StdWndProc(Window: HWND; Message, WParam: Longint;
  LParam: Longint): Longint; stdcallassembler;
asm
        PUSH EAX
        PUSH EBX
        MOV     EAX,[Message]
        MOV     EBX,[WM_LBUTTONDOWN]
        CMP     EAX, EBX
        POP     EBX
        POP     EBX
        JE      @@rupt
@@start:      // das hier ist der standardhandler
        XOR     EAX,EAX
        PUSH    EAX
        PUSH    LParam
        PUSH    WParam
        PUSH    Message
        MOV     EDX,ESP
        MOV     EAX,[ECX].Longint[4]
        CALL    [ECX].Pointer
        ADD     ESP,12
        POP     EAX
                // bis hierher, original  

        JMP     @@ausgang
@@rupt:
        INT     3
        JMP     @@start
@@ausgang:

end;

was auch sonderbar ist; ich habe den entsprechenden teil debuggt mit CPU-Fenster, aber erstens mal werden da meine aufrufe irgendwie komplett anders interpretiert, wird auch nix wie gewünscht in EAX geschrieben und so...woran kann das liegen ? siehe bild:
user defined image

edit: hmm mir fällt gerade auf, dass der compiler scheinbar immer noch den alten Code ausführt, also macht er halt statt meinem ersten befehl, das XOR EAX, EAX usw...muss ich da jetzt erst die unit classes neu compilieren ?

edit2: hat sich erledigt, musste die classes.pas mit dcc32.exe neu compilen ^^
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 30.01.05 22:20 
3 Hinweise:
1. EBX bei Delphi-Routinen IMMER unverändert lassen (genauso wie ESI, EDI, und EBP)
2. StdWndProc wird NUR aufgerufen, wenn die Message anderweitig noch nicht behandelt wurde.
3. Deine CMP-Befehlsfolge heißt besser CMP DWORD PTR [Message], WM_LBUTTONDOWN

BTW: Warum suchst Du nicht im Quelltext die Routine von T(Win)Control.WMLButtonDown raus (in der Classes einfach nach einer Routine mit "message WM_LBUTTONDOWN;" suchen. Das ist der jeweilige Handler. Außerdem sind viele Messages auch direkt in einem DefWndProc der Komponenten zusammengefasst. Da solltest Du auch noch einen Blick drauf werfen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.