| 
| Autor | Beitrag |  
| Martok 
          Beiträge: 3661
 Erhaltene Danke: 604
 
 Win 8.1, Win 10 x64
 Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
 
 | 
Verfasst: Sa 25.07.09 16:09 
 
	  |  MagicRain hat folgendes geschrieben  : |  	  | Da hab ich auch ne frage zu und zwar folgender code... 
 CMP EAX,10
 JNZ bla:
 
 Wenn ich sowas in einen Loop packen möchte gibt es da noch andere möglichkeiten das zu verwürklichen auzer GOTO label...
 | 
 Ja.
 	  |  BenBE hat folgendes geschrieben  : |  	  | Der Punkt ist ein anderer: Es geht den meisten hier darum, dass man zuerst Delphi ausreichend gut beherrschen sollte, bevor man überhaupt daran denkt, ASM als ein Mittel zur Problemlösung heranzuziehen, da man zuerst wissen sollte, was man mit der Sprache tun kann, bevor man mit anderen Sprachen nachhilft. | 
 Und in diesem besonderen Fall sollte man zumindest wissen, wie das Compilat des Hochsprachencompilers aussieht.
 Dan wüsstest du, dass dein Sprung da oben (je nach Context, den verrätst du ja nicht) entweder eine Schleife oder ein If ist._________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
 |  |  |  
| MagicRain  
          Beiträge: 154
 
 WinXp, Win8, iOS
 Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
 
 | 
Verfasst: Sa 25.07.09 16:15 
 
War ein schlechtes Beispiel soll ein IF darstellen. Also zum Beispiel so....
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 
 | IF A < 10 thenBreak;
 IF A < 10 then goto...;
 |  Gibt es für sowas noch andere lösungen oder nicht? Wenn ich zum Beispiel in einem loop eine Zeiler tiefer Springen will wenn das if erfüllt sein sollte oder geht das nur mit GOTO und zum Verlassen Break..? |  |  |  
| Flamefire 
          Beiträge: 1207
 Erhaltene Danke: 31
 
 Win 10
 Delphi 2009 Pro, C++ (Visual Studio)
 
 | 
Verfasst: Sa 25.07.09 16:51 
 
ok jetzt mal qualitative hilfe von mir:
 1) Jump befehle: 
 JMP - Unbedingter Sprung. Sollte Klar sein
 JNZ, JNE (is das gleiche): Sprung wenn Zero Flag nicht gesetzt, also wenn ergebnis <>0 oder Operanden <> sind
 JZ,JE : s.o. nur halt bei =0; A=B
 2)
 wenn du sowas hast:
 		                       Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 
 | MOV EAX,[EBP+4] //oder was auch immer in EAX berechnet wurdeCMP EAX,10
 JNZ LabelX
 ADD EAX,5
 //mache noch was
 LabelX: ADD EAX,1
 //Rest der Anweisungen
 |  Dann als erstes gucken was da gemacht wird! und mit worten beschreiben:
 Z.B.:
 vergleiche EAX mit $10
 wenn die ungleich sind springe über einen Code
 wenn er nicht springt, Addiere 5 zu EAX
 egal ob übersprungen oder nicht, mache immer das ab LabelX am Ende
 Und DANN  kommt der Delphi teil:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 
 | if(EAX=$10) then beginEAX:=EAX+5;end;
 EAX:=EAX+1;
 
 |  |  |  |  
| MagicRain  
          Beiträge: 154
 
 WinXp, Win8, iOS
 Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
 
 | 
Verfasst: Sa 25.07.09 17:04 
 
Ah das hab ich jetzt verstanden danke für dein Beispiel kannst ja doch hilfreich sein     |  |  |  
| Flamefire 
          Beiträge: 1207
 Erhaltene Danke: 31
 
 Win 10
 Delphi 2009 Pro, C++ (Visual Studio)
 
 | 
Verfasst: Sa 25.07.09 17:16 
 
ja stell dir vor    PS: kurz dazu ob dus wirklich verstanden hast
 übersetze mal bitte das hier in Delphi:
 		                       Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 
 | CMP EAX,10JE @x1
 ADD EAX,2
 JMP @x2
 @x1:Sub EAX,1
 @x2://...
 |  oder das: 		                       Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 
 | MOV ESI,12MOV EAX,0
 TEST ESI,ESI
 JE @l2
 @l1: ADD EAX,EAX
 CMP EAX,$FFFF
 JB @l2
 SUB ESI
 JNZ @l1
 @l2://....
 |  sind 2 häufige konstrukte...bringt dir also was, das zu übersetzen   |  |  |  
| MagicRain  
          Beiträge: 154
 
 WinXp, Win8, iOS
 Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
 
 | 
Verfasst: Sa 25.07.09 17:29 
 |  |  |  
| uall@ogc 
          Beiträge: 1826
 Erhaltene Danke: 11
 
 Win 2000 & VMware
 Delphi 3 Prof, Delphi 7 Prof
 
 | 
Verfasst: Sa 25.07.09 17:59 
 
es wäre ein END ELSE Dec(...) _________________ wer andern eine grube gräbt hat ein grubengrabgerät
 - oder einfach zu viel zeit
 |  |  |  
| Flamefire 
          Beiträge: 1207
 Erhaltene Danke: 31
 
 Win 10
 Delphi 2009 Pro, C++ (Visual Studio)
 
 | 
Verfasst: Sa 25.07.09 18:16 
 
richtig uall...aber das erwaret man von dir ja auch ^^
 aus dem grund hatte ich meine informelle beschreibung des asm codes auch so formuliert.
 guck dir das noch mal an
 und dann versuch dich am 2. bsp
 |  |  |  
| BenBE 
          Beiträge: 8721
 Erhaltene Danke: 191
 
 Win95, Win98SE, Win2K, WinXP
 D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
 
 | 
Verfasst: Sa 25.07.09 18:35 
 
_________________ 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.
 |  |  |  
| Flamefire 
          Beiträge: 1207
 Erhaltene Danke: 31
 
 Win 10
 Delphi 2009 Pro, C++ (Visual Studio)
 
 | 
Verfasst: Sa 25.07.09 20:50 
 
ist nicht nötig
 das ding ist komplett lauffähig, zumindest in sich...
 ob es etwaigen umliegenden code beeinträchtigt kann ich nicht ausschließen
 der einzige fehler ist:
 "SUB ESI"
 Das sollte "DEC ESI" werden...
 aber von mir aus kannst du MOV EAX,0 auch durch XOR EAX,EAX ersetzen   |  |  |  
| MagicRain  
          Beiträge: 154
 
 WinXp, Win8, iOS
 Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
 
 | 
Verfasst: Sa 25.07.09 21:34 
 |  |  |  
| BenBE 
          Beiträge: 8721
 Erhaltene Danke: 191
 
 Win95, Win98SE, Win2K, WinXP
 D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
 
 | 
Verfasst: Sa 25.07.09 22:06 
 
_________________ 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.
 |  |  |  
| Flamefire 
          Beiträge: 1207
 Erhaltene Danke: 31
 
 Win 10
 Delphi 2009 Pro, C++ (Visual Studio)
 
 | 
Verfasst: So 26.07.09 08:38 
 
@magicrain: ja das ist richtig!
 gut gemacht!    @BenBE: Seit wann kann man in Delphi direkt auf Register zugreifen? Wenn ich im Delphi EAX:=0; schreibe sucht er doch nach einer variable mit namen EAX
 im Asm teil nimmt er wirklich das register.
 und es ging ja darum ASM code zu haben, den magicrain dann übersetzen kann....
 sonst sind wir wieder am Anfang: Gemischter Code    BTW: Wie kommst du von XOR immer auf "+"?
 2 XOR 3=1
 ups...wenn dann scheint es ein minus zu sein...aber nur betragsmäßig.
 und ob das immer so klappt... |  |  |  
| BenBE 
          Beiträge: 8721
 Erhaltene Danke: 191
 
 Win95, Win98SE, Win2K, WinXP
 D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
 
 | 
Verfasst: So 26.07.09 09:13 
 
Warum ich bei dem einen Source von dir auf EAX := 0; bekomm:
 Weil ich grad keine Lust hatte, die Deklaration von var EAX: DWORD; mit anzugeben    Ferner: Die Schleife, selbst wenn du das SUB durch DEC ersetzt, führt in ihrer Addition immer ADD, 0, 0 aus, wodurch EAX von seinem Ausgangswert nicht verändert wird. Also kann ich mir schenken, was die Schleife tut und die Schleife rausoptimieren. Ergo: Dein Code weist der Variablen effektiv obfuskirt den Wert 0 zu.
 Sorry, aber ich übersetze, was Du hinschreibst ..._________________ 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.
 |  |  |  
| Flamefire 
          Beiträge: 1207
 Erhaltene Danke: 31
 
 Win 10
 Delphi 2009 Pro, C++ (Visual Studio)
 
 | 
Verfasst: So 26.07.09 10:38 
 
verdammt ja hast ja recht
delphi entsprechung davon ist tatsächlich EAX:=0;
 hatte ich nicht verstanden was du wolltest.
 
 ok also 2. Korrektur: MOV EAX,1
 dann stimmt das ganze, es sei denn ich hab den JB in der reihenfolge noch verhaun und der bricht mir die schleife gleich am anfang ab...mach ich häufiger. kann mir einfach nicht merken wierum das nun ist.
 |  |  |  
| BenBE 
          Beiträge: 8721
 Erhaltene Danke: 191
 
 Win95, Win98SE, Win2K, WinXP
 D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
 
 | 
Verfasst: So 26.07.09 11:34 
 
Okay, dann ist das ein EAX := 4096;. Alternativ könnte man auch EAX := 1 SHL 12; schreiben, was aber eh vom Compiler zu einer Konstante optimiert wird. _________________ 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.
 |  |  |  
| Flamefire 
          Beiträge: 1207
 Erhaltene Danke: 31
 
 Win 10
 Delphi 2009 Pro, C++ (Visual Studio)
 
 | 
Verfasst: So 26.07.09 11:41 
 
stimmt schon wieder...
 ach man...
 dann halt einfach MOV EAX,[ESP+4]
 und jz ruhe hier   |  |  |  
| BenBE 
          Beiträge: 8721
 Erhaltene Danke: 191
 
 Win95, Win98SE, Win2K, WinXP
 D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
 
 | 
Verfasst: So 26.07.09 11:48 
 
Okay, mal ein etwas schwierigerer zum Umsetzen, geht aber in Delphi umzusetzen:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 
 | function Foo: pointer;asm
 MOV EAX, [EBP+4]
 end;
 |  (Tipp: Man muss dazu ein wenig mit den Compiler-Settings spielen und ein paar Spezialitäten der Syntax von Delphi kennen UND wissen, wie Delphi mit lokalen Variablen umgeht). Gewinner ist der, mit der kürzesten Lösung; ich poste meine auch, sobald es mindestens eine korrekte Einsendung gab. Angabe aller nötigen Compiler-Settings gehört zur Lösung!
 @Flamefire: dein Auslesen von [ESP+4] ist EXTREM vom Kontext abhängig._________________ 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.
 |  |  |  
| Flamefire 
          Beiträge: 1207
 Erhaltene Danke: 31
 
 Win 10
 Delphi 2009 Pro, C++ (Visual Studio)
 
 | 
Verfasst: So 26.07.09 13:52 
 
hm...allein mit dem wissen über ASM würde ich behaupten, Foo gibt mir die Rücksprungadresse der aktuellen funktion
 da (in den meisten anwendungen) eine function so beginnt:
 		                       Quelltext 
 									| 1:2:
 3:
 4:
 
 | PUSH EBPMOV EBP,ESP
 SUB ESP,x
 //...
 |  ist EBP+4 die rücksprungadresse...
 in delphi auch wenn man "stackframes" aktiviert.
 umsetzung wäre z.b. so:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 
 | function Test(b:Cardinal):Cardinal;stdcall;var c:Cardinal;
 begin
 Result:=Cardinal(foo())-PCardinal(Cardinal(@c)+12)^;end;
 |  also einfach ein den Wert auslesen der 12 Bytes vor der ersten Variable beginnt. |  |  |  
| BenBE 
          Beiträge: 8721
 Erhaltene Danke: 191
 
 Win95, Win98SE, Win2K, WinXP
 D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
 
 | 
Verfasst: So 26.07.09 14:14 
 
_________________ 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.
 |  |  |  |