Выравнивание данных

Тема в разделе "WASM.WIN32", создана пользователем NeuronViking, 31 окт 2004.

  1. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    Все знают что при компилляции можно указать выравнивание структур данных по 1, 2, 4 и 8 байтовой границе. Проблема в том, что в одной ДЛЛ может быть установлено 4х байтововое выравнивание, а в другой 1 байтовое и т.д.

    Например, если при компиляции своего проекта указать "неверное" выравнивание структур данных, то при вызове экспортируемой функции из DLL можно повредить стек со всеми вытекающими...



    Какаким образом и откуда я могу узнать по какой границе выравнивались данные в той или иной библиотеке? например в наличии имеется DLL, LIB и .H файлы.



    Спасибо!
     
  2. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    Чего??? какое выравниевание? Если написать

    A dd 0

    B db 1

    то это будет структура из 5-и байт независимо от выравнивания. Возможно имеется ввиду выравнивание начала структур по границе, кратной какому-нить числу.
     
  3. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    имеется ввиду только то, что написано.
     
  4. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    2 Turkish

    если выравнивание равно 1, то это структура из 5 байт, а если 4 - то из восьми! Я сам с этим продолбался два дня, пока понял, в чем дело... Сумма размеров всех полей структуры равнялась 512 байт, но сама структура в памяти занимала 520 байт, соответственно, и на диск вместо одного сектор азаписывалось 1 сектор и еще 8 байт. Задолбался, пока нашел... Так что зря ты так... :derisive:
     
  5. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Если здесь говорится про компилятор "C", а не ассемблер, то прямо в коде нужная структура окружается командами pragma:
    Код (Text):
    1.  
    2. #pragma pack (1) // Align on 1 byte
    3. typedef struct tag_ITEM {
    4.   char ProductCode [3];
    5.   char ProductType;
    6. } ITEM;
    7. #pragma pack (8) // Align on 8 bytes
    8.  
     
  6. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    я спрашивал о том, как и где достать инфу о том как выровнены данные в DLLках если в наличии есть собсно ДЛЛки, их ЛИБы и куча .Н файлов.



    похоже что нигде и никак =(
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    А в хидерах разве нет структур ?!
     
  8. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее


    а что такое "структур"? 8)



    ладно тема закрыта... буду ковыряца сам
     
  9. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    правильнее было бы написать #pragma pack(pop) а в начале #pragma pack(push, 1)

    S_T_A_S_

    наверняка есть и если все пИсано по уму то и с прагмами :)
     
  10. Narkomanius

    Narkomanius New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2003
    Сообщения:
    144
    вообще то по умолчанию все ДЛЛки в винде имеют выравнивание 4 байта. если только самому не поизвращаться в _своей_ ДЛЛке.
     
  11. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее




    мне нельзя полагаться на "умолчание", очень часто это "умолчание" идет лесом...