Autor Beitrag
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Sa 25.07.09 17:09 
user profile iconMagicRain hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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 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: Sa 25.07.09 17:15 
War ein schlechtes Beispiel soll ein IF darstellen. Also zum Beispiel so....
ausblenden 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
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: 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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
if(EAX=$10then begin//Vergleiche EAX mit $10 und überspringe Code bei UNGLEICH!
EAX:=EAX+5;
//mache noch was
end;
EAX:=EAX+1;
//rest
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: Sa 25.07.09 18:04 
Ah das hab ich jetzt verstanden danke für dein Beispiel kannst ja doch hilfreich sein :P :roll:
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: 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:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
CMP EAX,10
JE @x1
ADD EAX,2
JMP @x2
@x1:Sub EAX,1
@x2://...


oder das:
ausblenden 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 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: Sa 25.07.09 18:29 
Verdammt jetzt will er es aber wissen :roll: :lol:
also ich denke mal so müsste das ausehen :shock:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
If (eax=$10then begin
eax := eax+2;
end;
dec(eax);
//@x2:restmachen
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: 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
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: 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
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: Sa 25.07.09 19:35 
ausblenden 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://....

ausblenden Quelltext
1:
[Fehler]example2.pas(8): Invalid Opcode					


Für eine Delphi-Umsetzung würd ich mal sagen:
ausblenden Delphi-Quelltext
1:
EAX := 0;					

_________________
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
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: 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 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: Sa 25.07.09 22:34 
Oh ja else stimmt hab da mal was probiert...

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
        MOV EDX,$016
@Project1_0045101D:
        CMP EAX,$012
        JNZ @Project1_00451027
        ADD EAX,5
        JMP @Project1_00451032
@Project1_00451027:
        CMP EAX,$014
        JNZ @Project1_0045102F
        INC EAX
        JMP @Project1_00451032
@Project1_0045102F:
        ADD EAX,$016
@Project1_00451032:
        DEC EDX
        JNZ @Project1_0045101D
        RETN

=
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
a,i : Integer;
begin
for i := 1 to 22 do
begin
if(a=$12then begin
a:=a+5;
end else
if(a=$14then begin
a:=a+1;
end else
a := a + 22;
end;
end;
Cool das hab ich hoffe ich dann so weit geil thx :)
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: Sa 25.07.09 23:06 
user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
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 ;-)

Trotzdem ist dein Teil ein reines EAX := 0; :P 0+0 = 0 :P

_________________
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
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: 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
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: 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 :P

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
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: 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
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: 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
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: So 26.07.09 12:41 
stimmt schon wieder...
ach man...

dann halt einfach MOV EAX,[ESP+4]
und jz ruhe hier ;-)
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: So 26.07.09 12:48 
Okay, mal ein etwas schwierigerer zum Umsetzen, geht aber in Delphi umzusetzen:

ausblenden 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
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: 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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
function Test(b:Cardinal):Cardinal;stdcall;
var c:Cardinal;
begin
  Result:=Cardinal(foo())-PCardinal(Cardinal(@c)+12)^;//Immer 0 ;-)
end;

also einfach ein den Wert auslesen der 12 Bytes vor der ersten Variable beginnt.
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: So 26.07.09 15:14 
Also, was meine Funktion angibt, ist richtig: Sie liefert die Rücksprungadresse
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
{$R-}
function Foo: Pointer;
var 
    S:array[0..0of Integer;
Begin
    S[0] := 2;
    Result := Pointer(S[S[0]]);
end;


Ganz ohne Typecasts geht's so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
{$R-}
function Foo: Pointer;
var 
    S:array[0..0of record case Boolean of false: (I: Integer;); true: (P: Pointer;); end;
Begin
    S[0].I := 2;
    Result := S[S[0].I].P;
end;

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