Autor Beitrag
MagicRain
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
BeitragVerfasst: Di 14.07.09 21:29 
Hallo ich mal wieder "LEIDER"...:P und zwar habe ich ein kleines problem mit dem ausrufen einer function sie hier...

ausblenden Quelltext
1:
Dies habe ich vor : ->> XCHG EAX,ESI					


A := EAX , Y := ESI : Integer; ...

Try: ->>
ausblenden Delphi-Quelltext
1:
2:
3:
4:
Function ByteSwap(i: Word): Word;
ASM
  XCHG EAX, ESI;
End;

-
ausblenden Delphi-Quelltext
1:
2:
Aufruf versuch: ->>
A := ByteSwap(A(Y)); .... A := ByteSwap(a[Y]);    da muckt er auch rum :( ....


und einfach......
ausblenden 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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 14.07.2009 um 21:52
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 14.07.09 22: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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure ByteSwap(var a,b:Word);inline;
ASM
XCHG ESI,EDI //welches register is der 2. param?
End;
MagicRain Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
BeitragVerfasst: Di 14.07.09 22:14 
Also...

ausblenden Delphi-Quelltext
1:
2:
Var
   a, y : Integer;


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 14.07.09 22: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
BeitragVerfasst: Di 14.07.09 22:35 
1) Da fängt das problem auch schon an keine ahnung wie man so eine Function oder Procedure richtig aufruft..

ausblenden 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 //welches register is der 2. param?
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
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: Di 14.07.09 22: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.

ausblenden 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.

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
MagicRain Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
BeitragVerfasst: Di 14.07.09 23:23 
Ja ok danke egal ich geb dann auf.. muss ich mich wohl erst mehr mit Delphi befassen..tschau..

MfG
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 15.07.09 05:16 
user profile iconMagicRain hat folgendes geschrieben Zum zitierten Posting springen:
//welches register is der 2. param?
Das hatte ich in deinem anderen Thread bereits geschrieben:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMagicRain hat folgendes geschrieben Zum zitierten Posting springen:
wie komm ich jetzt an den wert ran oder wie läuft das ? weil nun B := EAX <<< das geht ja nicht...
Wenn du direkt eine Assemblerroutine komplett in Assembler schreibst, dann kannst du auf die Parameter und Rückgabewerte so zugreifen:
Die Parameter stehen der Reihe nach in EAX, EDX, ECX, weitere auf dem Stack.
Der Rückgabewert gehört in EAX. Ausnahme sind Strings und Interfaces. Dort wird das Ziel für den Rückgabewert als weiterer Parameter mitgegeben.
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 15.07.09 07: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 ...

_________________
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.
MagicRain Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
BeitragVerfasst: Mi 15.07.09 19: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