![]() |
AW: Portierungsproblem mit Assembler, Register
Drei Punkte:
1. Würdest du eventuell das Problem, dass du im ersten Beitrag geschildert hast bitte im ![]() 2. Wirf mal bitte einen Blick in die Unit crc (zu finden in $FPCDIR/packages/hash/src), vielleicht reicht das ja für deine Anwendung (wobei ich dir natürlich nicht ausreden möchte DEC zu portieren :mrgreen: ) 3. Du könntest wegen dem PIC Problem mal auf der ![]() Gruß, Sven |
AW: Portierungsproblem mit Assembler, Register
Hallo Sven,
Zitat:
Zitat:
Zitat:
Grüße, Uwe |
AW: Portierungsproblem mit Assembler, Register
nicht so schnell aufgeben, versuche
Delphi-Quellcode:
Ich finde die andere Schrebweise aber "OOP ähnlicher" und deshalb nutzte ich sie, besonders auch beim ASM Zugriff auf Delphi Objekte und Klassen.
asm
MOV [EAX + OFFSET TCRCDef.Polynomial], EDX end; Normalerweise sollte das FPC aber im Delphi Mode unterstützen, dh. der Inline Assembler scheint nicht 100% kompatibel zu sein, Gruß Hagwe |
AW: Portierungsproblem mit Assembler, Register
Um die Fragestellung zu beantworten warum ich es so und nicht anders programmiert habe, besonders in Sicht auf die Verwendung des Funktionszeigers als Adresse auf eine im Codesegment gespeicherte Tabelle.
Ich hatte damals drei Ziele mit der CRC Unit: 1.) Unterstützung aller CRCs mit bis zu 32Bit 2.) extrem kompakter Code 3.) ausschließliche Nutzung des Codesegmentes also kein DATA und BSS Segment notwendig. Letzterer Punkt ist wichtig wenn das DATA/BSS Segment der Zielanwendung nicht das der eigentlichen Anwendung ist die den CRC Code enthält. Wer zwischen den Zeilen lesen kann weiß worauf das hinausläuft. Gruß Hagen |
AW: Portierungsproblem mit Assembler, Register
Hallo Hagen,
danke für die Antworten. Das Problem war eigentlich schon gelöst. Zitat:
Das PIC-Problem trat hier auf, wenn ich mich nicht irre: (Handelt sich wohl um eine globale Referenz auf FCRC16. Könnte man vielleicht lösen, wenn man FCRC16 als Parameter übergibt)
Delphi-Quellcode:
Der Fehler kommt unabhängig davon ob PIC definiert ist oder nicht.
function CRC16(CRC: Word; const Buffer; Size: Cardinal): Word;
asm JECXZ @@2 PUSH EDI PUSH ESI MOV EDI,ECX {$IFDEF PIC} MOV ESI,[EBX].FCRC16 // hier kracht's auch! Not PIC-Safe {$ELSE} MOV ESI,FCRC16 {$ENDIF} XOR ECX,ECX TEST ESI,ESI JZ @@3 @@1: MOV CL,[EDX] XOR CL,AL SHR EAX,8 INC EDX XOR EAX,[ESI + ECX * 4] DEC EDI JNZ @@1 POP ESI POP EDI @@2: RET @@3: PUSH EAX PUSH EDX CALL CRC16Init MOV ESI,EAX XOR ECX,ECX POP EDX POP EAX JMP @@1 end; Wahrscheinlich wird es noch einige Stellen im Code von DEC geben, über die FPC oder Lazarus stolpert. Wenn ich dich dann jedesmal nerven darf, würde ich weitermachen. ;) Grüße, Uwe |
AW: Portierungsproblem mit Assembler, Register
Zitat:
Damals war Freepascal noch keine Alternative für mich, heute würde ich das DEC nur damit entwickeln wollen. Da Cylix ziemlich schnell tot war habe ich die Kompatiblität dahingehend aufgegeben. Denoch die schon enthaltenen Stellen nicht wieder entfernt. Du solltest dich also in diese Thematik einarbeiten, informierst mich über die Forderungen die erfüllt werden müssen und dann kann ich dir fast aus dem Stegreif sagen was du wo im Source überprüfen musst. Andererseits musst du für dich entscheiden ob sich letzendlich der Aufwand lohnt. So ist das eben mit Assembler und schlechterer Portierbarkeit. Die Argumente sowas in PASCAL Source zu machen sind nicht von der Hand zu weisen, wenn man nicht unbedingt das Meiste rausholen will. Gruß Hagen |
AW: Portierungsproblem mit Assembler, Register
Zitat:
Wir müssen nur wissen wie wir im inline Assembler korrekt auf globale Variablen und Funktionsaddressen zugreifen können. Das geht über das Register EBX. Entscheidend ist die korrekte Syntax und Informationen wann man diese Zugriffsvariante benutzen muß und wann nicht. Gruß Hagen |
AW: Portierungsproblem mit Assembler, Register
In Anbetracht der Änderungen im 64Bit-Compiler und geplanter weiterer Prozessorplattformen, sollte man vielleicht auf inline Assembler oder sogar Assembler komplett verzichten
|
AW: Portierungsproblem mit Assembler, Register
Zitat:
Zitat:
Delphi-Quellcode:
[DCC Fehler] DECUtil.pas(768): E2029 'BEGIN' erwartet, aber 'INITIALIZATION' gefunden
Irgendwo fehlt da wohl ein $ENDIF, oder? Aber wo? :? Ansonsten werde ich jetzt erstmal versuchen DEC 5.2 (was ist eigentlich mit DEC 5.3?) unter Windows mit Lazarus/FPC lauffähig zu bekommen. Assembler kann man schon verwenden, denke ich. Die meisten von Lazarus/FPC unterstützten Plattformen laufen eh mit Intelprozessoren. Schön wäre aber, wenn man für alle ASM-Routinen eine Pascal-Variante hätte, dann könnte man immer noch einzelne Plattformen mit entsprechenden ASM-Funktionen optimieren. Passiert in der Lazarus-Community normalerweise fast automatisch. Grüße, Uwe |
AW: Portierungsproblem mit Assembler, Register
Hmm, für Win32 läuft's schonmal mit Lazarus. Dabei kommt offenbar die PIC-Problematik nicht zum Tragen.
Trotzdem, war einfacher als gedacht. :D @Hagen: Hast du ein Testprogramm womit man mal weite Teile der DEC ausprobieren kann, oder so? Ich habe nur mal schnell einen Encrypt/Decrypt-Versuch gemacht, der funktioniert. Auch mit unter Delphi codierten Strings. Das hat geklappt:
Delphi-Quellcode:
function EncryptString(const Password: RawByteString;
const Value: RawByteString): RawByteString; var Salt, SessionKey: Binary; begin Salt := RandomBinary(16); with TCipher_Rijndael.Create do try SessionKey := THash_SHA1.KDFx(Password, Salt, Context.KeySize, TFormat_Copy); mode := cmCFS8; // ein 8Bit Feedback Modus ist für kurze Datenmengen sicherer Init(SessionKey); result := TFormat_MIME64.Encode(Salt + EncodeBinary(Value, TFormat_Copy)); finally Free; ProtectBinary(Salt); ProtectBinary(SessionKey); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz