Порт структуры из С в FASM

Тема в разделе "WASM.ASSEMBLER", создана пользователем shoo, 23 ноя 2006.

  1. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    в файле ibase.h имеется структура:
    Код (Text):
    1. typedef struct {
    2.     short   version;        /* version of this XSQLDA */
    3.     char    sqldaid [8];        /* XSQLDA name field */
    4.     ISC_LONG    sqldabc;        /* length in bytes of SQLDA */
    5.     short   sqln;           /* number of fields allocated */
    6.     short   sqld;           /* actual number of fields */
    7.     XSQLVAR sqlvar [1];     /* first field address */
    8. } XSQLDA;
    переписываю в асм:
    Код (Text):
    1. struct XSQLDA    
    2.     version             dw ? ; +0
    3.     sqldaid             rb 8 ;
    4.     sqldabc             dd ? ; +12
    5.     sqln                dw ? ; +16
    6.     sqld                dw ? ; +18
    7.     sqlvar              XSQLVAR ; first field address
    8. ends
    но размер структуры в с - 172 байта, а у меня - 170 байт. заполняю ее в сях поэлементно и смотрю в отладчике - размеры совпадают, а вот смещения отличаются на два байта начиная с sqldabc (указаны в коментах). лечу так:
    Код (Text):
    1.     sqldaid             rb 8 ;
    2.                         rb 2 ;
    3.     sqldabc             dd ? ; +12
    поскольку в хлл у меня опыт небольшой, идея у меня одна: может, char sqldaid [8] имеет в начале двухбайтное слово для длины строки? или я чего-то не догнал?
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    может выравнивание не учел?
     
  3. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    для указателей? я не знаю в каких случаях элементы структуры могут выравниваться автоматически. (в смысле неявно)
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    дефолтный align = DWORD
     
  5. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    в каких случаях внутри структуры? ведь не для каждого ж элемента.
    ===
    Код (Text):
    1. #define  ISC_LONG   int
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    shoo
    Мм, по-моему, для всех. Но вообще, надо смотреть, какое выравнивание по-умолчанию в ключах компилятора и не было ли оно переопределено в заголовочном файле.
    Для align 4 думаю так будет:
    Код (Text):
    1. typedef struct {
    2.     short    version;        /* version of this XSQLDA */
    3.     char pad[2];
    4.     char    sqldaid [8];        /* XSQLDA name field */
    5.     ISC_LONG    sqldabc;        /* length in bytes of SQLDA */
    6.     short    sqln;            /* number of fields allocated */
    7.     short    sqld;            /* actual number of fields */
    8.     XSQLVAR    sqlvar [1];        /* first field address */
    9. } XSQLDA;
     
  7. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    IceStudent
    именно так
     
  8. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    кажется начинаю догонять.
    явных спецификаций быстро я не нашел, но так понял, что элемент выравнивается по своему размеру (в общем случае): байт - на 1, слово на 2, а двойное - на 4. вот тестовая структура и смещения для элементов:
    Код (Text):
    1. typedef struct {
    2.     char        field1; /* 0 */
    3.     int         field2; /* 4 */
    4.     char        field3; /* 8 */
    5.     short       field4; /* 10 */
    6.     char        field5; /* 13 */
    7. } TEST_STRUCT;
    а sizeof(TEST_STRUCT) дает значение 16 (кратное 4, точно не 2)
     
  9. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    censored
    нет :) pad - перед int!
    ===
    вот я записываю туда букву (из отладчика):
    Код (Text):
    1. MOV BYTE PTR DS:[ECX+2],DL
    (есх - указатель на структуру)
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    врядли :)

    хотя посмотрел я на картинки в мсдн и засомневался
     
  11. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    Asterix
    интригует :)
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Asterix
    так и есть, я когда-то проверял =)
    PS: в Delphi просто record выравнивается таким же образом.
     
  13. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    shoo
    Совершенно верно.