push в цикле в Delphi

Тема в разделе "WASM.SOFTWARE", создана пользователем KeSqueer, 1 апр 2008.

  1. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Код (Text):
    1.                 mov     ebx, ecx
    2.                 test    ebx, ebx
    3.                 js      short loc_44E571
    4.                 shr     ebx, 2
    5.  
    6. loc_44E56A:
    7.                 mov     esi, [edx+ebx*4]
    8.                 dec     ebx
    9.                 push    esi
    10.                 jns     short loc_44E56A
    11.  
    12. loc_44E571:
    13.                 mov     edx, esp
    Какому это исходному коду соответствует? а-ля alloca ?
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    KeSqueer
    ИМХО инициализируется локальная переменная а-ля массив (строк, например). Для уточнения смотри, что собой представляет память по адресу edx.
     
  3. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Ещё это может быть передача по значению какой-то сложной структуры какой-то функции - копирование её на стек. Что дальше с edx происходит? И что до этого в edx было?
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    При копировании структуры ее размер известен заранее. А в данном случае это скорее всего копирование параметра функции типа "открытый массив": array of byte (или char или перечислимого размером byte), т.е.
    Код (Text):
    1. procedure X(?;A:array of byte); //register
    2. //eax = ? - если это метод класса, то eax = скрытому (неявному) параметру Self
    3. //edx = @A, элементы массива изменяются в процедуре, поэтому создается его копия
    4. //ecx = High(A) = count-1
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Понятно, спасибо
     
  6. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    diamond
    Любят афтары код либо совсем маленькими кусками, либо огромными листингами выкладывать.
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    leo
    Один из возможных вариантов. Меня только смутил размер блока данных (кратен 4). Структура может иметь размер и не кратный 4, а здесь вроде общий случай не рассматривается... Но это все ИМХО, а по-поводу размера выложенного афтаром кода я уже высказался.
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    crypto
    Могу выложить кусок размера побольше, яснее вряд ли станет. Но все же добавлю тогда:
    код стоит в начале процедуры
    edx потом сохраняется в локальную переменную и используется первый раз для вызова метода класса, второй раз - как второй параметр для sendto. Изменяется или нет тот буфер - сказать не могу, отладчик по этой ветке кода не проходит и направить его туда с трудом. В коде выше edx и ecx соответственно второй и третий параметр, передаваемый процедуре. Т.е. значение ecx тоже заранее неизвестно
     
  9. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    KeSqueer
    Тогда либо смотреть, какой тип имеет второй параметр в sendto, либо смотреть что собой представляет edx при вызове.
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    crypto
    Повторю, что размер структуры известен компилятору заранее и он всегда > 0, поэтому нет никакого смысла в первых трех строчках mov+test+js. А для open array число элементов минус 1 передается неявным параметром и в принципе м.б. < 0, если использовать ф-ю Slice.

    В дельфи 7 приведенный выше код генерится при вызове например такого метода класса:
    Код (Text):
    1. procedure TFoo.foo(A:array of byte);
    2. begin
    3.   A[0]:=A[0]*2; //любое изменение элемента массива
    4. end;