Добрый день. Понадобилось восстановить одну процедуру, скомпилированную судя по всему с какими-то параметрами оптимизации. Почти весь код восстановил, кроме одного кусочка (см. листинг). Поискал в интернете и здесь: единственное что понял - так это то, что это какой-то вариант оптимизации деления. Вроде бы дклится число, полученое функцией rand на какое-то другое число, но на какое - я не могу понять. Помогите пожалуйста решить этот вопрос. Код (Text): call rand ;вызов стандартной процедуры rand библиотеки msvcrt mov ecx,66666667h mov ebx, eax imul ecx mov esi, ebx sar esi, 1Fh mov [ebp+var_1], edx ; mov [ebp+var_2], eax ; mov eax, [ebp+var_1] sar eax, 1 sub eax, esi lea edx, [eax+eax*4] sub ebx, edx
В edx изначально хранится число (длинна текущего пакета данных). А можно по подробнее? Мне просто не совсем понятно (
zAjac Ей богу)..не могу понять....чего сложного? call rand ;вызов стандартной процедуры rand библиотеки msvcrt mov ecx,66666667h mov ebx, eax imul ecx // в eax старшая часть, в edx младшая mov esi, ebx // в ecx значение rand sar esi, 1Fh // сдвинули биты вправо (поделили) на 31//тобишь остался только бит знака mov [ebp+var_1], edx ; в стек младшая часть произведения на rand на ecx mov [ebp+var_2], eax ;в стек старшая часть mov eax, [ebp+var_1] ; в eax младшая часть произведения на rand на ecx sar eax, 1 // поделили на 2 старшую часть произведения sub eax, esi // вычли из eax бит знака.. (вычитаем еденицу если отрицательно) lea edx, [eax+eax*4] ; записываем адрес [eax+eax*4] в edx sub ebx, edx вычитаем из rand адрес
mov esi, ebx // в ecx значение rand тут опечатка) mov esi, ebx // в esi значение rand тут тоже опечатка sar eax, 1 // поделили на 2 старшую часть произведения надо так sar eax, 1 // поделили на 2 младшую часть произведения
Точнее rand() по модулю 5. В отличие от %, модуль числа 5 всегда положительный. Поэтому здесь и присутствуют штучки с определением знака и его вычитанием
Блин, куда дели редактирование ?!!! Уточню: x mod 5 = x-(x/5+sign(x)*5, где sign = 0 при x >= 0, и =1 при x < 0