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 17: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 17:15
War ein schlechtes Beispiel soll ein IF darstellen. Also zum Beispiel so....
Delphi-Quelltext 1: 2: 3:
| IF A < 10 then Break; 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 17: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 wurde CMP 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 18: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 18: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,10 JE @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,12 MOV 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 18:29
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Sa 25.07.09 18: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 19: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 19: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 21: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 22: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 23: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 09: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 10: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 11: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 12: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 12: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 12: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 14: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 EBP MOV 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 15: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.
|
|
|