Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Function a inline aufrufen nur wie ?
MagicRain - Di 14.07.09 20:29
Titel: Function a inline aufrufen nur wie ?
Hallo ich mal wieder "LEIDER"...:P und zwar habe ich ein kleines problem mit dem ausrufen einer function sie hier...
Quelltext
1:
| Dies habe ich vor : ->> XCHG EAX,ESI |
A := EAX , Y := ESI : Integer; ...
Try: ->>
Delphi-Quelltext
1: 2: 3: 4:
| Function ByteSwap(i: Word): Word; ASM XCHG EAX, ESI; End; |
-
Delphi-Quelltext
1: 2:
| Aufruf versuch: ->> A := ByteSwap(A(Y)); .... A := ByteSwap(a[Y]); da muckt er auch rum :( .... |
und einfach......
Delphi-Quelltext
1: 2: 3: 4: 5:
| asm mov eax,a mov esi,y XCHG EAX, ESI; end; |
geht auch nicht puh echt ein mist das ganze inline asm von delphi is auch sone sache für sich
Da ich schon öfter hiermit probleme hatte bzw es noch nie hin bekommen habe hoffe ich ihr werdet mir da helfen und mir vlt erklären wie das ganze abläuft und funktioniert btw was ich falsch mache...
MfG
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Di 14.07.2009 um 21:52
Flamefire - Di 14.07.09 21:05
1) geht nicht gibts nicht! bitte genauere beschreibung was du vorhast und was passiert (welcher fehler, welches ergebnis)
2) dann bitte die var-deklarationen angeben
was ist a und was ist y?
und wenn beides words sind, was soll dan bei a(y) rauskommen?
du kannst keinen word auf ein word anwenden...
wie wäre es mit
Delphi-Quelltext
1: 2: 3: 4:
| procedure ByteSwap(var a,b:Word);inline; ASM XCHG ESI,EDI End; |
MagicRain - Di 14.07.09 21:14
Also...
ich muss eine assambler line in delphi übersetzen... und zwar XCHG EAX,ESI
Also EAX und ESI haben einen bestümmten wert schon bekommen und dann wird der befehl XCHG EAX,ESI ausgeführt. Und das muss ich jetzt irgendwie in delphi hinbekommen nur wie ist die frage...ich habe eine procedure wo ich ein assambler stück nach code und nun muss ich irgendwie diesen befehl hinbekommen..nur wie ich die funktion auf rufen soll oder das anders regeln soll mit dem befehl ich weiß nicht irgendwie muss das doch gehen.
MfG
Flamefire - Di 14.07.09 21:20
1) es geht auch
2) wenn du verständlicher schreibst macht es mehr spaß deinen post zu lesen
3) du hast immer noch keine meldungen oder genauere beschreibungen gepostet
4) Integer->Word?
Müsstest du dann nicght auch Integers in der Funktion verwenden? Macht auch mehr sinn, da EAX,ESI 32Bit Register sind.
5) Guck mal nach was xchg macht. Meiner Meinung anch verstauscht die einfach nur 2 werte...
und das kannste wohl sehr einfach selbst machen
6) Was wäre du testest meine funktion erstmal und sagst was rauskommt (Jetzt natürlich noch word durch integer ersetzen)
MagicRain - Di 14.07.09 21:35
1) Da fängt das problem auch schon an keine ahnung wie man so eine Function oder Procedure richtig aufruft..
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure ByteSwap(var a,b:Integer); ASM XCHG ESI,EDI End;
procedure TForm1.btn1Click(Sender: TObject); var a , b : Integer; begin A := 10; B := 22; A := ByteSwap(0,a); txt1.Text := IntToStr(a); end; |
2. Werte ... EAX == 0x000001A4 , ESI == 0000172C << SUB EAX,ESI >> dann ... EAX == 0000172C , ESI == 000001A4
3. Wäre schön wenn ich wüsste wie man so eine Funktion oder Procedure aufrufen kann bis jetzt habe ich das noch nie hinbekommen oder irgendwo etwas gefunden wie es gehen soll gerade weil ich öfter mal solche funktionen brauchen könnte bei specialen ASM-Befehlen.
4. Also deine Procedure bekomme ich nicht zum laufen weil ich nicht weiß wie ich das auf rufen soll ByteSwap(a); oder so das läuft leider nicht ...
MfG
uall@ogc - Di 14.07.09 21:55
1) Hast du im anderen Post noch nicht geantwortet, also was willst du machen? In der DP wurd ein Thread von dir gelöscht.
2) Solltest du dich erstmal bisl mit Delphi auseinandersetzen bevpr du in Assembler ran gehst. Siehe Aufruf einer Prozedur mit angeblichen Rückgabeparameter
3) Ein XCHG ist ein Austausch von 2 Register (und kein ByteSwap), das kommt eher einem Austausch von 2 Variablen nach.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure Exchange(var a, b: Word); var h: Word; begin h := a; a := b; b := h; end; |
Ich wieß auch nicht warum du alles unbedingt in Delphi Funktionen mit Assembler auslagen willst, schreib die Komplette Funktion die du hast einfach in Assembler in einer Delphi Funktion nach.
MagicRain - Di 14.07.09 22:23
Ja ok danke egal ich geb dann auf.. muss ich mich wohl erst mehr mit Delphi befassen..tschau..
MfG
BenBE - Mi 15.07.09 06:48
Delphi kann kein Inline für Funktionen oder Prozeduren, die ASM enthalten. Das wird schlicht vom Compiler ignoriert.
Der Rest wurde hier bereits gesagt ...
MagicRain - Mi 15.07.09 18:16
Gott sei danke hab es hinbekommen meine fresse :D @uall@ogc habe dein ansatz benutzt so in der Art hat es dann geklappt eigentlich ja auch gar nicht so schwer eigentlich ne logische sache man mein kopf war wieder weg :D
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!