Autor Beitrag
DOCa Cola
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

Vista x64
D2007
BeitragVerfasst: So 28.06.09 20:52 
ich habe versuch folgenden asm code in delphi nachzubauen, nur ich komme nicht so ganz darauf, wie ich den in der hochsprache umsetzen soll.
der linke wert ist ein long bzw integer bei dem diverse bit flags gesetzt sind. anhand dieses vergleichs soll dann eben code ausgeführt werden oder nicht. das der vergleich in der asm version nur mit dem ersten byte erfolgt ist wohl ganz einfach eine compiler optimierung
ausblenden Quelltext
1:
2:
TEST BYTE PTR DS:[ECX+1D4], 0C0
JE *adresse*

ich habe versucht es in delphi so umzusetzen:
ausblenden Delphi-Quelltext
1:
if (m_objType and $c0) = $c0 then					

aber ich denke mein code ist eine falsche "übersetzung", da er sich anders verhält. wenn m_objType zum beispiel mit $0AE0189A gefüllt ist (der asm code vergleicht hier also mit 9A), führt der asm code oben den sprung nicht durch - also der code wird ausgeführt - während meine umsetzung den code überspringt (da das ergebnis von if false ist)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19303
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.06.09 21:05 
Dein Delphicode prüft, ob die Bits ($c0) gesetzt sind. Willst du schauen, ob diese nicht gesetzt sind, musst du nicht = sondern <> benutzen.

Der Assemblercode springt ja weg, wenn diese gesetzt sind. Der Code danach wird also nicht ausgeführt, insofern ist das doch so wie es ist richtig. ;-)
DOCa Cola Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

Vista x64
D2007
BeitragVerfasst: So 28.06.09 21:15 
danke für die schnelle antwort, aber vielleicht habe ich es etwas schlecht beschrieben. eigentlich ist es schon richtig das der code ausgeführt werden soll, wenn der vergleich "klappt". hier nochmal ein bischen mit pseudocode:
ausblenden Quelltext
1:
2:
3:
4:
TEST BYTE PTR DS:[ECX+1D4], 0C0
JE sprung
//Hier Code der ausgeführt werden soll wenn C0 flag enthalten ist
sprung:


man kann es auch mit diesem delphi code testen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.btn1Click(Sender : TObject);
label
  sprung;
var
  wert : integer;
begin
  wert := $0AE0189A;
  asm
    TEST BYTE PTR DS:[wert], $C0
    JE sprung
  end;
  showmessage('code wird ausgeführt');
  sprung:

end;

_________________
Star Trek Armada II: Fleet Operations - fleetops.net
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19303
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.06.09 21:42 
Ja, sicher wird der Code ausgeführt. Die Bits $C0 sind ja auch nicht gesetzt, also wird auch nicht zum Sprungziel gesprungen. Also wird der Code nicht übersprungen.

Der Assemblercode sorgt dafür, dass der Code übersprungen wird, wenn die Bits gesetzt sind, nicht umgekehrt.

Nebenbei auch hier noch der Link zum Crosspost:
www.delphipraxis.net/post1053831.html
DOCa Cola Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

Vista x64
D2007
BeitragVerfasst: So 28.06.09 22:07 
ja, aber wenn du die variable 'wert' in meinem beispiel auf $c0 setzt, wird der code auch ausgeführt ;)

edit: so, die lösung ist das man die werte auf diese weise verwendet, dann generiert delphi auch ähnlichen asm code
ausblenden Delphi-Quelltext
1:
if (m_objType and $c0) > 0 then					


trotzdem vielen dank für die unterstützung!

_________________
Star Trek Armada II: Fleet Operations - fleetops.net
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: Mo 29.06.09 14:12 
falsch!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.btn1Click(Sender : TObject);
label
  sprung;
var
  wert : integer;
begin
  wert := $0AE0189A;
  asm
    TEST BYTE PTR DS:[wert], $C0
    JE sprung
  end;
  showmessage('code wird ausgeführt');
  sprung:

end;

hier wird der code nicht übersprungen, weil die bits nicht gesetzt sind

Hier auch nicht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.btn1Click(Sender : TObject);
label
  sprung;
var
  wert : integer;
begin
  wert := $c0;
  asm
    TEST BYTE PTR DS:[wert], $C0
    JE sprung
  end;
  showmessage('code wird ausgeführt');
  sprung:

end;

Aber Hier:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.btn1Click(Sender : TObject);
label
  sprung;
var
  wert : integer;
begin
  wert := $0c000000;
  asm
    TEST BYTE PTR DS:[wert], $C0
    JE sprung
  end;
  showmessage('code wird ausgeführt');
  sprung:

end;

weil du nur das erste byte testest

bei deiner variante funktioniert es zwar, aber nur bei byte-typen wie im original
DOCa Cola Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

Vista x64
D2007
BeitragVerfasst: Mo 29.06.09 14:25 
nene, die integers werden ja in little-endian gespeichert, also ist die byte reihenfolge genau umgekehrt.
im speicher sieht
$c0 so aus: 0c000000
und
$0c000000 so aus: 000000c0

der asm code prüft auch das erste byte von dem integer, also das kleinste. es macht auch keinen unterschied, wenn du
ausblenden Delphi-Quelltext
1:
TEST [wert], $c0					

schreibst (bei dem er dann das ganze dword evaluiert)

_________________
Star Trek Armada II: Fleet Operations - fleetops.net
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: Mo 29.06.09 14:50 
ok ich dachte genau das ist der grund warum es nicht ging...aber stimmt. ist ja schon so rum

BTW:
ausblenden Delphi-Quelltext
1:
if (m_objType and $c0) > 0 then					

und if (m_objType and $c0) =$c0 then
sollte für $c0 das gleiche sein.
aber für $80 sollte nur das erste triggern...
und ich glaube das erste ist auch das asm teil.
hatte ich zumindest auch so in meinem programm
DOCa Cola Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64

Vista x64
D2007
BeitragVerfasst: Mo 29.06.09 14:53 
ja, das stimmt. inzwischen habe ich begriffen das der code eben triggern soll, wenn 'm_objType' entweder 0x80 bzw 0x40 enthält (also 7 bzw 8 bit gesetzt ist). das war mir vorher nicht ganz klar

_________________
Star Trek Armada II: Fleet Operations - fleetops.net