Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Delphi + ASM
Flamefire - Mo 17.09.07 17:35
Titel: Delphi + ASM
wie kann ich einen string aus delphi an eine funktion übergeben?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure chaten();
begin
asm
PUSH 'Ich liebe euch alle!!!'
CALL 400456
end;
end |
Ich muss nur nen Pointer auf nen Ascii string auf dem Stack haben
Moderiert von
Gausi: Delphi-Tags hinzugefügt
r2c2 - Mo 17.09.07 19:46
Delphi-Strings sind recht komplex. Prinzipiell kann man die zwar auch per ASM nachbauen(siehe hierzu:
http://www.dsdt.info/insider/sprache/interna/ansistrings.php), aber das ist IMHO ungerechtfertigter Aufwand. Numm in dem Fall besser PChar. Das ist dann nix anderes als n Pointer auf n Speicherbereich, in dem die ASCII-Werte stehen. Ein #0 schließt den String ab...
Das müsste dann ungefähr so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| s: string; s2: PChar; begin s := 'Das ist ein Test'; s2 := PChar(s); asm push s2 end; end; |
mfg
Christian
P.S.: bitte delphi-Tags verwenden...
Flamefire - Di 18.09.07 05:59
jo ok danke
BenBE - Di 18.09.07 19:21
Alternativ kann man aber auch das machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure Foo; asm PUSH OFFSET [@@StrVarPtr+8] CALL Bar JMP @@E
@@StrVarPtr: DD -1 DD 12 DB 'Hello World!', 0 @@E: end; |
Das was ich hier in ASM gemacht hab, macht Delphi sonst hinter dem RET-Befehl der Prozedur. Da Delphi aber u.U. noch ein Stackframe erstellt, kann man oftmals schlecht direkt mit RET rausspringen. Außerdem würde man damit Toten Code im Binary erzeugen, was auf die Weise vermieden wird.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!