Аддресация в структуре

Тема в разделе "WASM.BEGINNERS", создана пользователем dsoft, 14 июл 2010.

  1. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Имеется такая структура:
    Код (Text):
    1.   TStars        STRUCT
    2.     ColorR  GLfloat ?
    3.     ColorG  GLfloat ?
    4.     ptSize  GLfloat ?
    5.     X       GLfloat StarsCount dup(?)
    6.     Y       GLfloat StarsCount dup(?)
    7.     Z       GLfloat StarsCount dup(?)
    8.     Speed   GLfloat 0.05f
    9.   TStars ends
    как мне обратиться, например, к Z[10]?
    Мне нужно сделать так:
    Код (Text):
    1.     fld   TStars.Z[ebx]
    2.     fadd  TStars.Speed
    3.     fstp  TStars.Z[ebx]
    где ebx счётчик цикла
     
  2. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    скорей всего одной иструкции не хватит.
    нужно что то тип такого:
    Код (Text):
    1. lea edi,[z]  ;загрузка адресса первого элемента массива
    2. fld     TStars.Z[edi + sizeof(GLfloat)*ebx]
    3. fadd  TStars.Speed
    4. fstp  TStars.Z[edi + sizeof(GLfloat)*ebx]
    Размер GLfloat должен быть одним из 1,2,4,8.
     
  3. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Переписал так:
    Код (Text):
    1.     lea   eax, GLfloat PTR TStars.Speed
    2.     lea   edi, GLfloat PTR TStars.Z
    3.     fld   TStars.Z[edi + sizeof(GLfloat) * ebx]
    4.     fadd  GLfloat PTR [eax]
    5.     fstp  TStars.Z[edi + sizeof(GLfloat) * ebx]
    в IDA вижу такой код:
    Код (Text):
    1. loc_4012CA:             ; CODE XREF: sub_4012AB+3Cj
    2.         lea eax, ds:2A30h
    3.         lea edi, ds:2328h
    4.         fld dword ptr [edi+ebx*4+2328h]
    5.         fadd    dword ptr [eax]
    6.         fstp    dword ptr [edi+ebx*4+2328h]
    непонятно, почему ссылка на структуру идёт прямым адресом
     
  4. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    dsoft
    что непонятного?
    если адрес посадки будет другой, она прорелочится и всё
     
  5. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    При просмотре IDA-ой я не нашёл саму структуру ни чего либо напоминающего, поэтому и вопрос о прямой ссылке.
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    dsoft
    не правда - правильно
    fld TStars.Z[sizeof(GLfloat) * ebx]
    которое скомпилится в
    fld dword ptr [ebx*4+2328h]
    где адрес структуры уже забит
    а из-за добавления lea edi, GLfloat PTR TStars.Z и [edi + ...] получается что адрес структуры прибавляется дважды

    или если хочешь адресацию только через регистр то:
    lea edi, GLfloat PTR TStars.Z
    fld [edi + sizeof(GLfloat) * ebx]
    уже без имени структуры и поля.
    Этот вариант обязателен если структура TStars локальная (расположена в стеке)
    Для глобальной структуры выбор первого или второго варианта адресации дело вкуса - [извращение] второй иногда может сэкономить несколько байт за счёт сокращения длины команд fld, fstp :)) [/извращение]

    Но не оба сразу же их применять в одной команде :))
     
  7. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    some TStars <>

    lea ESI,some
    mov byte ptr ((TStars ptr [SI]).z)+10,AL
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Код (Text):
    1. some TStars <>
    2.  
    3. lea ESI,some
    4. mov EBX,10
    5. mov byte ptr ((TStars ptr [SI]).z)[EBX],AL
    идея понятна ??
     
  9. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Код (Text):
    1. fld   TStars.Z[sizeof(GLfloat) * ebx]
    семантическая бредятина

    после имени структуры должен быть ptr и адрес экземпляра (пусть косвенный [ebx]) дальше точка и тд
     
  10. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Код у тебя правильный только для локальных структур, когда в качестве базы не явно будет ebp. Но лучше чтобы у переменной было имя отличное от имени структуры.

    Например:
    Код (Text):
    1. LOCAL Stars:TStars     ;локальное имя Stars
    2.     ...
    3.     fld   Stars.Z[ebx]
    4.     fadd  Stars.Speed
    5.     fstp  Stars.Z[ebx]
    Для обращения к глобальной структуре в твоём коде не хватает базы
    Код (Text):
    1.     mov edi,offset Stars    ;Stars глобальная структура, edi - база
    2.     fld   TStars.Z[ebx][edi]
    3.     fadd  TStars.Speed[edi]
    4.     fstp  TStars.Z[ebx][edi]
    На счет масштабирования с ebx уже сам думай.
     
  11. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Так и есть, из-за чего я тормознул.
    Не уверен, ассемблер для меня не основной язык.
    С масштабированием всё понятно, этому меня приучил Паскаль.
    А всё таки может All подскажет почему я не нахожу структуру в IDA-е? Объявлена она у меня глобально.
     
  12. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Скорее всего, для кого-то это прозвучит бредом, но мне взбрело в голову переложить код из Паскаля на Ассемблер, и в данном случае это:
    Код (Text):
    1. const
    2.   StarsCount    = 450;
    3.  
    4. type
    5.   TStars        = record
    6.     ColorR,
    7.     ColorG,
    8.     Size,
    9.     X, Y, Z : array[0..StarsCount - 1] of GLfloat;
    10.     Speed   : GLfloat;
    11.   end;
    12.  
    13.   for I := 0 to StarsCount - 1 do
    14.   begin
    15.     with Stars do
    16.     begin
    17.       glColor3f(ColorR[i], ColorG[i], 1.0);
    18.       glPointSize(Size[i]);
    19.       Z[i] := Z[i] + Speed;
    20.       glBegin(GL_POINTS);
    21.         glVertex3f(X[i], Y[i], Z[i]);
    22.       glEnd;
    23.  
    24.       if Z[i] > -1 then
    25.       begin
    26.         X[i] := RandFloat(16) - 8;
    27.         Y[i] := RandFloat(16) - 8;
    28.         Z[i] := Random(10) - 25;
    29.       end;
    30.     end;
    31.   end;
     
  13. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    После указания
    Код (Text):
    1. some TStars <>
    структура наконец появилась в IDA-е.
     
  14. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Всем спасибо, в дизассемблере наконец увидел правильный код с верной адресацией к структуре.
     
  15. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Попутно возник ещё вопрос. После указания
    Код (Text):
    1. Stars TStars <>
    хоть локально, хоть глобально, exe файл вырастает на размер структуры. Можно ли как-нибудь создавать структуру динамически, чтобы не увеличивать размер файла?
     
  16. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Можно получить память динамически: LocalAlloc, VirtualAlloc.

    Код (Text):
    1. push sizeof (TStars) ;
    2. push LMEM_FIXED
    3. call LocalAlloc
    4. ; в еах у тебя теперь указатель на память
    5.  
    6. ;когда память уже будет не нужна, красиво будет ее освободить ).
    7. push eax
    8. call LocalFree
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Все переменные, структуры, массивы в секции .data? не увеличивают размер файла, в нём хранятся только инициализированные из секции .data

    Про Local и GlobalAlloc давно пора забыть это оставлено для совместимости с win16, а уже win64 идёт полным ходом :)
    Вместо них HeapAlloc для мелких блоков, а VirtualAlloc для крупных (она значительно медленнее HeapAlloc и выделяет целые страницы памяти).
    И набери в поиске по форуму эти функции узнаешь много интересного.
     
  18. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Y_Mur
    хм странно в мсдн нету упоминания об
     
  19. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    XshStasX
    MSDN 2008 SP1:
    LocalAlloc Function
    ...
    Note The local functions are slower than other memory management functions and do not provide as many features. Therefore, new applications should use the heap functions.
    ...
    Remarks
    Windows memory management does not provide a separate local heap and global heap.

    Правда есть скользкий нюанс из-за которого их окончательно так и не перенесли в разряд Obsolete Functions.
    Буфер обмена (Clipboard) для совместимости с win16 до сих пор требует использования GlobalAlloc, GlobalLock, хотя ничего не мешало предусмотреть альтернативный вариант совместимый на уровне "внутренностей" но с нормальными API. Появилось ли это хотя-бы в win64 не знаю не разбирался.
     
  20. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Что значит, плохо знать язык. Вся ошибка была в этом:
    Код (Text):
    1. .data?
    2.   Stars     TStars <?>
    И зачем я ставил вопрос, сам не пойму.
    Спасибо за подсказку про заём памяти.