MiniZlib نسخة مصغرة من مكتبة ZLib
#11
إقتباس :عندما تكتب OpCode فانت تحصل على ما تريد/كما تريد/أينما تريد بعد الترجمة وهنا تبتعد عن مفاجئات الOptimization التي يقوم بها المترجم ضف امكانية استخدام Runtime معدل/مختلف !
أختلف معك أخي B.M.AbdelAziZ ؟
السبب : لا وجود للOptimization في الأسمبلي
يعني استخدام الاسمبلي في دالة = غياب للOptimization في تلك الدالة .
هل تعلم حتى أن ال inline لا تتم في الاسمبلي ؟
ال OpCode الناتج يختلف من كومبايلر لكومبايلر عند استخدام أسلوب باسكال للكتابة + نوع المعالج..
ستكتب ما تريد ب الأسمبلي أو ال OpCode لتحصل تماما على ما كتبته (على نفس CPU)
ال OpCode يختلف في بعض التعليمات من CPU الى CPU مثال :
بعض ال opCode لتعليمات معالج amd مختلفة كليا عن ال opCode لتعليمات معالج intel
الكتابة ب opCode تفرض العمل على نوع محدد من البروسس .
الكتابة ب ال asm تترجم الى ال opCode الخاص بالمعالج المستخدم للترجمة .
يعني يفضل الكتابة بال asm حتى تعمل على جميع المعالجات .
الأسمبلي ماهي الا لغة صممت حتى يفهمها الانسان .. تترجم بدون أي تعديلات أو تغييرات على ال OPCode
=> asm=opcode

ألق نظرة على هذا الكتاب :
الكتاي بوضح كيفية عمل Disassembler (From OpCode To Asm Instructions)
كود :
http://tuts4you.com/download.php?view.187
Open Your Source .. Open Your Mind
الرد
#12
virtual كتب :على حد علمي مترجم دلفي او فري باسكال , لا يستطيع تحسين كود اسمبلي داخل دالة , فهو يبقيه كما هو .
حتى تعليمة inline لا تعمل اذا وجد سطر اسمبلي واحد فقط في دالة . في الاستدعاء ستجد call

نعم كلامك صحيح .. لا وجود لل optimization على أكواد الأسمبلي
Open Your Source .. Open Your Mind
الرد
#13
virtual كتب :وجدت الحل .
يجب عليك ان تخزن قيمة حجم الملف الغير مضغوط اولا , داخل الملف المضغوط او في مكان اخر
عند فك الضغط استخرج هذه القيمة و احجز بها ذاكرة ل OutData , ثم استخدم الدالة DecompressData

بالفعل لقد نجحت في فك التشفير ..
لقد قمت بكتابة دالتين جاهزتين لتشفير و فك ملف .
دالة التشفير تقوم بحفظ حجم الملف الأصلي في آخر الملف بطول 4 بايت :

PHP كود :
{ => LZOCompressFile & LZODeCompressFile routines By SMP3 <= }
function 
LZOCompressFile(inFile, OutFile: PChar): LongInt;
var
  
P, Buffer: Pointer;
  
hFile: THandle;
  
FileSize: DWORD;
  
BRW: DWORD;
  
OutSize: integer;
  function 
CompressData(const InData: Pointer; InSize: LongInt;
    
out OutData: Pointer; out OutSize: LongInt): LongInt;
  var
    
WorkBuf: array [Word] of Byte;
  
begin
    FillChar
(WorkBuf, SizeOf(WorkBuf), 0);
    
OutSize := InSize + ((InSize div 1024) + 1) * 16;
    
OutData := GetMemory(OutSize);
    
Result := lzo_compress(InData^, InSize, OutData^, OutSize, WorkBuf);
  
end;

begin
  Result 
:= -1;
  
hFile := CreateFile(inFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,
    
FILE_ATTRIBUTE_NORMAL, 0);
  if 
hFile <= 0 then
    
Exit;

  
FileSize := GetFileSize(hFile, 0);
  
GetMem(P, FileSize);
  
ReadFile(hFile, P^, FileSize, BRW, 0);
  
Result := CompressData(P, FileSize, Buffer, OutSize);
  
FreeMem(P, FileSize);
  
CloseHandle(hFile);

  
hFile := CreateFile(OutFile, GENERIC_WRITE, FILE_SHARE_READ or
    
FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  if 
hFile <= 0 then
    begin
      Result 
:= -1;
      Exit;
    
end;
  
WriteFile(hFile, Buffer^, OutSize, BRW, 0);
  
Result := OutSize;
  { 
Set the cursor to last byte }
  
SetFilePointer(hFile, 0, 0, soFromEnd);
  { 
Write the Original file Size }
  
WriteFile(hFile, FileSize, 4, BRW, 0);
  
CloseHandle(hFile);

end;

function 
LZODeCompressFile(inFile, OutFile: PChar): LongInt;
var
  
P, Buffer: Pointer;
  
hFile: THandle;
  
FileSize: DWORD;
  
BRW: DWORD;
  
OutSize, OrgFileSize: integer;
begin
  Result 
:= -1;
  
hFile := CreateFile(inFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,
    
FILE_ATTRIBUTE_NORMAL, 0);
  if 
hFile <= 0 then
    
Exit;

  
FileSize := GetFileSize(hFile, 0);
  if 
FileSize <= 0 then
    
Exit;

  
Dec(FileSize, 4); { Get compressed file size }
  
GetMem(P, FileSize);
  
ReadFile(hFile, P^, FileSize, BRW, 0);

  { 
Get Original File Size }
  
SetFilePointer(hFile, -4, 0, soFromEnd);
  
ReadFile(hFile, OrgFileSize, 4, BRW, 0);

  
GetMem(Buffer, OrgFileSize);
  
lzo_decompress(P^, FileSize, Buffer^, OutSize);
  
FreeMem(P, FileSize);
  
CloseHandle(hFile);

  { 
Save File to Disk }
  
hFile := CreateFile(OutFile, GENERIC_WRITE, FILE_SHARE_READ or
    
FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  if 
hFile <= 0 then
    begin
      Result 
:= -1;
      
FreeMem(Buffer, OrgFileSize);
      Exit;
    
end;
  
WriteFile(hFile, Buffer^, OutSize, BRW, 0);
  
CloseHandle(hFile);
  
Result := OrgFileSize;
  
FreeMem(Buffer, OrgFileSize);
end; 
ملاحظة الدوال لا تعمل على bit 64
Open Your Source .. Open Your Mind
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم