Einzelnen Beitrag anzeigen

NicoDE
(Gast)

n/a Beiträge
 
#4

Re: Problem mit ShellMessageBox

  Alt 23. Mär 2004, 09:25
Zitat von MathiasSimmack:
Dankeschön kann ich da nur sagen.
Keine Ursache

Zitat von MathiasSimmack:
was genau passiert im Assemberteil?
Code:
[color=blue]       { EBX muss gesichert werden (wird auf dem Stack abgelegt) }[/color]
[color=gray]       push   ebx[/color]
[color=blue]       { Bei 'array of' befindet sich vor dem ersten Element der Wert von High }[/color]
[color=gray]       mov    ecx,[Arguments-$04][/color]
[color=blue]       { Hier wird der Offset zum letzten Element zusammengebaut (High*4) }[/color]
[color=gray]       mov    ebx,ecx[/color]
[color=gray]       shl    ebx,$02[/color]
[color=blue]       { Aus dem High(Arguments) wird nun Length(Arguments) (+1) }[/color]
[color=gray]       inc    ecx[/color]
[color=blue]       { Prüfen ob es gar keine zusätzlichen Argumente gibt (ecx ist 0) }[/color]
[color=blue]       { Wenn dann geht es sofort zur Übergabe der benötigten Parameter }[/color]
[color=gray]       jz     @@call[/color]
[color=blue]       { Erste Element holen und dann zum letzten Element wechseln }[/color]
[color=blue]       { cdecl erwartet die Parameter in 'umgekehrter' Reihenfolge }[/color]
[color=gray]       mov    edx,[Arguments][/color]
[color=gray]       add    edx,ebx[/color]
[color=blue]       { Aktuelles Element auf dem Stack ablegen }[/color]
[color=gray]@@loop: push   dword ptr [edx][/color]
[color=blue]       { Zum nächsten Element wechseln (rückwärts) }[/color]
[color=gray]       sub    edx,$04[/color]
[color=blue]       { ECX um 1 verringern und auf 0 prüfen }[/color]
[color=blue]       { solange ECX <> 0 weiter mit Schleife }[/color]
[color=gray]       loop   @@loop[/color]
[color=blue]       { Nun die benötigten Parameter auf dem Stack ablegen }[/color]
[color=gray]@@call: push   dword ptr [Style][/color]
[color=gray]       push   dword ptr [Title][/color]
[color=gray]       push   dword ptr [Msg][/color]
[color=gray]       push   dword ptr [Wnd][/color]
[color=gray]       push   dword ptr [Inst][/color]
[color=blue]       { Funktion aufrufen (Ergebnis ist dann in EAX) }[/color]
[color=gray]       call   FNShellMessageBox[/color]
[color=blue]       { Stack mit benötigten Parametern abräumen }[/color]
[color=blue]       { ($14, aber ebx basiert nicht auf Length, sondern auf High) }[/color]
[color=gray]       add    esp,$18[/color]
[color=blue]       { Stack mit zusätzlichen Argumenten abräumen }[/color]
[color=gray]       add    esp,ebx[/color]
[color=blue]       { Ergebnis in Result speichern }[/color]
[color=gray]       mov    [Result],eax[/color]
[color=blue]       { EBX wiederhergestellen (vom Stack holen) }[/color]
[color=gray]       pop    ebx[/color]
Zitat von MathiasSimmack:
Gab´s nicht eine Lösung in ... äh ... normaler Delphi-Sprache
Leider nicht, ...
Delphi-Quellcode:
asm
        push ...
end;
ShellMessageBox(...)
asm
        add esp,...
end;
...wäre viel zu unsicher (da es von der Annahme ausgeht, dass der Compiler keine Anweisung zischen die asm-Bläcke und den Aufruf der Funktion packt).


Gruss Nico

ps: kurz vor Deiner Antwort hab ich oben noch ne Kleinigkeit geändert
[edit] elende Tippfehler, nicht mein Tag heute ... [/edit]
  Mit Zitat antworten Zitat