Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Rol in delphi


MagicRain - Mo 13.07.09 19:10
Titel: Rol in delphi
Ich habe ein problem mit 2 befehlen sie zu übersetzen...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Tabelle:
0055AF6C  85 C0 74 05 E8 63 82 EA FF 8B D3 80 E2 FE 8B C6  …Àtèc‚êÿ‹Ó€âþ‹Æ
0055AF7C  E8 73 97 ED FF 84 DB 74 07 8B C6 E8 18 85 EA FF  ès—íÿ„Ût‹Æè…êÿ
0055AF8C  8B C6 55B C3 840 00 55 8B EC 33 C0 55 68 B9  ‹Æ^[Ã@.U‹ì3ÀUh¹

LEA EDI,DWORD PTR DS:[Tabellen_Adresse]
MOV AL,BYTE PTR DS:[EDI+EAX] ; tabellenadresse + eax ? :S


Wie genau könnte ich das in Delphi umsetzen ist das überhaubt machbar ? und dann noch dies...


Delphi-Quelltext
1:
ROL EDX,3                    


wie soll das in delphi gehen ? also den befehl gibt es so leider nicht könnte nur shr finden aber das wohl was anderes...für hilfe bin ich sehr dankbar.....

MfG


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 13.07.2009 um 19:43


uall@ogc - Mo 13.07.09 19:27

das 1. ist ein zugriff auf ein lokales Array wobei eax die position angibt


Delphi-Quelltext
1:
  woot := bla[nummer];                    


2. geht so viel ich weiß nicht direkt in Delphi (rotale left)


Delphi-Quelltext
1:
  wert := (wert shl 3or (wert shr 29);                    



wobei du da auch direkt den assembler code benutzen kannst


MagicRain - Mo 13.07.09 19:39

Erstmal danke :)

1. müsste so doch richtig sein eigentlich hmm?


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
//**********TABELLE****************
CONST tabelle: array [1..48] of byte = (
$C6, $C1, $E8, $03, $32, $46, $04, $32,
$47, $04, $0F, $85, $31, $B8, $02, $00,
$33, $C0, $40, $85, $C0, $0F, $84, $33,
$B8, $02, $00, $8A, $46, $05, $A8, $E0,
$0F, $85, $04, $08, $00, $00, $80, $BF,
$86, $05, $00, $00, $01, $0F, $85, $E7

MOV AL,BYTE PTR DS:[EDI+EAX]

das ist dann so Tabelle + varA ? also A := Tabelle+A; oder A := Ord(Tabelle[A)); oder lieg ich da falsch ?....

2.
Wie meinst du gleich in asm also mit inline geht es leider nicht das funktioniert irgendwie nie bei mir..

Quelltext
1:
2:
3:
asm
rol eax, 3
end;

wie komm ich jetzt an den wert ran oder wie läuft das ? weil nun B := EAX <<< das geht ja nicht... das schon ne harte nuss wie man sieht...hoffe da kann mir noch jemand helfen um ein für alle mal das zu checken :)

also wert := (wert shl 3) or (wert shr 29); läuft auch irgendwie nicht...

zb 10 rol 3 = 13 .. bei dem code bekomme ich iein kram raus wie 902982 oder so oO komisch..

Moderiert von user profile iconNarses: Code-Tags ergänzt.


jaenicke - Mo 13.07.09 19:44

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.


uall@ogc - Mo 13.07.09 19:46

1. einfach:

var
wert: byte;

Delphi-Quelltext
1:
  wert := tabelle[nummer];                    


wobei nummer = eax, al = wert

2. Ein Rol kann durch shiften nachgebaut werden (siehe meinen vorherigen post)

du kannst ganz einfach assembler und delphi mischen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  blub := $12345678;
  asm
    mov eax, dword ptr[blub]
    rol eax
    mov dword ptr[blub], eax
  end;
  writeln(eax);


das gilt übrigens auch für das mit der tabelle


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
  asm
    push edi
    push eax
    mov eax, 2
    mov edi, offset tabelle
    mov al, byte ptr[edi+eax]

    // al hat einen wert von $E8

    pop eax
    pop edi
  end;


MagicRain - Mo 13.07.09 20:02

Ah schonmal gut cool....


Delphi-Quelltext
1:
wert := tabelle[nummer];                    


Wie das genau gehen soll das tut es nicht so genau


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
//**********TABELLE****************
CONST tabelle: array [1..48of byte = (
$C6$C1$E8$03$32$46$04$32,
$47$04$0F$85$31$B8$02$00,
$33$C0$40$85$C0$0F$84$33,
$B8$02$00$8A$46$05$A8$E0,
$0F$85$04$08$00$00$80$BF,
$86$05$00$00$01$0F$85$E7

MOV AL,BYTE PTR DS:[EDI+EAX]  also...

--------------------------------------
;LODS BYTE PTR DS:[ESI] ====>>> A := Ord(String[i]);
nehmen wir ann wir geben ein String = S == 53 = hex
nun macht er das

MOV AL,BYTE PTR DS:[EDI+EAX] ...... Tabelle + 53 = neuer wert bzw eine adresse...

also soll ich einfach A := Tabelle + A; das geht so leider nicht wohl nicht so einfach schade....resultat in hex ausgeben soll ein offset ergeben.....
..............................................................................................


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  blub := $12345678;
  asm
    mov eax, dword ptr[blub]
    rol eax
    mov dword ptr[blub], eax
  end;
  writeln(eax);

var 
blub,eax : Integer;
//und dann Edit2.text := EAX; IntToHex(EAX, 0); da kommt auch wieder iein kram raus hrr :(



Delphi-Quelltext
1:
2:
3:
4:
5:
function RotateByteLeft(AByte, Positions: Byte): Byte; register;
asm
mov cl, dl
rol al, cl
end;


Dieser code ob der geht ? bloß wie ruf ich sowas auf ?? RotateByteLeft( A, 3) haut iwie nicht hin...man ist das ne schwere sache ich sitzt da schon 2 tage dran das gibts nicht :autsch: :autsch: :autsch: :autsch:


uall@ogc - Mo 13.07.09 21:05

Sorry hab nicht verstanden was du willst.

Im Grunde ist MOV AL,BYTE PTR DS:[EDI+EAX] nichts anderes als ein Zugriff auf einen Wert in der Tabelle. In EAX steht der Index, in EDI die Adresse der Tabelle. In Delphi kannst du das direkt mit Zugriff über den Index machen.

Wenn der Index ausm String kommt wird ne schleife drumrum sein in etwa so:


Delphi-Quelltext
1:
2:
for i := 1 to Length(s) di
al := tabelle[Ord(s[i])];


Rol eher so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function RotateByteLeft(AByte: Byte; Positions: Byte): Byte;
asm
  MOV CL, Positions
  ROL AByte, CL
  MOV Result, AByte
end;

function RotateByteLeft2(AByte: Byte; Positions: Byte): Byte;
asm
  MOV CL, DL
  ROL AL, CL
end;


procedure RotateByteLeft3(var AByte: Byte; Positions: Byte);
asm
  MOV CL, Positions
  ROL [AByte], CL
end;

1. ist zwar die am besten lesbare aber leider auch bisl langsamer

btw.: Was hast du vor? Gestern war wohl in der DP ein Thread offen der wohl gelöscht wurde...