Код (Text): mov ebx, ecx test ebx, ebx js short loc_44E571 shr ebx, 2 loc_44E56A: mov esi, [edx+ebx*4] dec ebx push esi jns short loc_44E56A loc_44E571: mov edx, esp Какому это исходному коду соответствует? а-ля alloca ?
KeSqueer ИМХО инициализируется локальная переменная а-ля массив (строк, например). Для уточнения смотри, что собой представляет память по адресу edx.
Ещё это может быть передача по значению какой-то сложной структуры какой-то функции - копирование её на стек. Что дальше с edx происходит? И что до этого в edx было?
При копировании структуры ее размер известен заранее. А в данном случае это скорее всего копирование параметра функции типа "открытый массив": array of byte (или char или перечислимого размером byte), т.е. Код (Text): procedure X(?;A:array of byte); //register //eax = ? - если это метод класса, то eax = скрытому (неявному) параметру Self //edx = @A, элементы массива изменяются в процедуре, поэтому создается его копия //ecx = High(A) = count-1
leo Один из возможных вариантов. Меня только смутил размер блока данных (кратен 4). Структура может иметь размер и не кратный 4, а здесь вроде общий случай не рассматривается... Но это все ИМХО, а по-поводу размера выложенного афтаром кода я уже высказался.
crypto Могу выложить кусок размера побольше, яснее вряд ли станет. Но все же добавлю тогда: код стоит в начале процедуры edx потом сохраняется в локальную переменную и используется первый раз для вызова метода класса, второй раз - как второй параметр для sendto. Изменяется или нет тот буфер - сказать не могу, отладчик по этой ветке кода не проходит и направить его туда с трудом. В коде выше edx и ecx соответственно второй и третий параметр, передаваемый процедуре. Т.е. значение ecx тоже заранее неизвестно
KeSqueer Тогда либо смотреть, какой тип имеет второй параметр в sendto, либо смотреть что собой представляет edx при вызове.
crypto Повторю, что размер структуры известен компилятору заранее и он всегда > 0, поэтому нет никакого смысла в первых трех строчках mov+test+js. А для open array число элементов минус 1 передается неявным параметром и в принципе м.б. < 0, если использовать ф-ю Slice. В дельфи 7 приведенный выше код генерится при вызове например такого метода класса: Код (Text): procedure TFoo.foo(A:array of byte); begin A[0]:=A[0]*2; //любое изменение элемента массива end;