Что нового

Перевести код Delphi в AutoIt

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Помогите, пожалуйста, перевести код Delphi в AutoIt. Так же хочу понять, что он делает.
Код:
asm
pushad
mov esi, DWORD[CompressPtr]
mov ecx, DWORD[CompressLen]
mov eax, $0F0F0F0F
sub ecx, 4
@@1: xor [esi], eax
inc esi
dec ecx
jnz @@1
popad
end;
CompressPtr - указатель на структуру, содержащую некоторую последовательность байтов, CompressLen - размер этой структуры.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
XORит всю структуру по 4 байта с маской 0F0F0F0F.
Проще говоря, можно побайтно всю структуру XORить с 0F
Да, и 16 последних байт структуры не затрагивает.

При чем тут Delphi ? Это ассемблер в чистом виде. В функцию на Delphi сделана вставка на ассемблере.
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
C2H5OH [?]
можно побайтно всю структуру XORить с 0F
А если не $0F0F0F0F, а, например, $AABBCCDD, то можно каждые 4 байта "XORить" 1-ый AA, 2-ой BB, 3-ий CC, 4-ый DD и т.д., я правильно понимаю?
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Кстати Purebasic поддерживает asm вставки, значит можно вставить этот код в pb, сделать dll и из au3 её вызывать...
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
C2H5OH [?]
и 16 последних байт структуры не затрагивает
То есть, если осталось меньше 16 байт, то конец, так как размер произвольный и не кратный 16?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
я правильно понимаю?

Та функция в ассемблере работает с 64-разрядными регистрами. Поэтому берётся 4 байта $0F0F0F0F
Если будет реализация на AutoIt, то придется XORить побайтно. То есть, нужно будет брать

каждые 4 байта "XORить" 1-ый AA, 2-ой BB, 3-ий CC, 4-ый DD и т.д.,

То есть, если осталось меньше 16 байт, то конец, так как размер произвольный и не кратный 16?
Нет. Ассемблерный код берёт длинну CompressLen и сразу отнимает от неё 4
4 - это 4 блока по 64 бита.
То есть в CompressLen уже идёт длинна в dword
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
C2H5OH [?]
Ассемблерный код берёт длинну CompressLen и сразу отнимает от неё 4
Можно подробней. Дело в том, что эта последовательность байтов читается из файла, размер которого произвольный. Если, например, размер в байтах 24629, то до какого байта надо "XORить"?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Если в лоб, то примерно так
Код:
Global $aCompressPtr[$iCompressLen]
Local $esi = 0
Local $ecx = $iCompressLen
Local $eax = 0x0F0F0F0F
$ecx -= 4
Do
	$aCompressPtr[$esi] = _XOR($aCompressPtr[$esi], $eax)
	$esi += 1
	$ecx -= 1
Until $ecx = 0


При условии что элементы массива dword


Добавлено:
Сообщение автоматически объединено:

Вот как вычисляется CompressLen ДО вызова этой функции ?
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
C2H5OH [?]
как вычисляется CompressLen
Код:
//...
CompressLen:=FileSeek(FHandle,0,2);
FileSeek(FHandle,0,0);
CompressPtr := AllocMem(CompressLen);
FileRead(FHandle, CompressPtr^, CompressLen);
FileClose(FHandle);
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Сори, немно тупанул с esi.
Код:
$esi += 1


это следующий байт, а не следующий dword



Добавлено:
Сообщение автоматически объединено:

И сразу становится понятно зачем 4 отнимается
Код:
Global $aCompressPtr[$iCompressLen]
$esi = 0
Local $ecx = $iCompressLen
$ecx -= 4
Do
	$aCompressPtr[$esi] = BitXOR($aCompressPtr[$esi], 0x0F)
	$aCompressPtr[$esi+1] = BitXOR($aCompressPtr[$esi+1], 0x0F)
	$aCompressPtr[$esi+2] = BitXOR($aCompressPtr[$esi+2], 0x0F)	
	$aCompressPtr[$esi+3] = BitXOR($aCompressPtr[$esi+3], 0x0F)
	$esi += 1
	$ecx -= 1
Until $ecx = 0


И, само собой, $aCompressPtr - маcсив байт
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
C2H5OH,
Большое Вам спасибо! :thanks:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
OffTopic:
Сам офигел. Пойти что ли на такую работу чтоб программированием заняться...
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
OffTopic:
alex33 сказал(а):
Кстати Purebasic поддерживает asm вставки, значит можно вставить этот код в pb, сделать dll и из au3 её вызывать...
FreeBasic аналогично...
а далее можно и dll в au3 загрузить
 
Верх