Autor |
Beitrag |
MagicRain
      
Beiträge: 154
WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
|
Verfasst: Mo 13.07.09 19:10
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 5E 5B C3 8D 40 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
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 Narses: Topic aus Sonstiges (Delphi) verschoben am Mo 13.07.2009 um 19:43
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 13.07.09 19:27
das 1. ist ein zugriff auf ein lokales Array wobei eax die position angibt
Delphi-Quelltext
2. geht so viel ich weiß nicht direkt in Delphi (rotale left)
Delphi-Quelltext 1:
| wert := (wert shl 3) or (wert shr 29); |
wobei du da auch direkt den assembler code benutzen kannst
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
MagicRain 
      
Beiträge: 154
WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
|
Verfasst: 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
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 Narses: Code-Tags ergänzt.
Zuletzt bearbeitet von MagicRain am Mo 13.07.09 19:45, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 13.07.09 19:44
MagicRain hat folgendes geschrieben : | 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
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: 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]
pop eax pop edi end; |
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
MagicRain 
      
Beiträge: 154
WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
|
Verfasst: 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:
| 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] 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; |
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 
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: 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...
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
|