Size: a a a

Ассемблер

2020 August 28

RS

Rusty Shackleford in Ассемблер
а еще упаковщики структур есть... этой темы я даже касаться боюсь ))
источник

RS

Rusty Shackleford in Ассемблер
с этим бы разобраться, вопрос собственно в том, что размер всей структуры должен быть кратен 8 в x64 или нет, соотвественно 7 байт дополнять нужно в конце, в примере выше, или нет )
источник

A

Aleksandr in Ассемблер
так, твоя правда
источник

A

Aleksandr in Ассемблер
тип данных должен быть расположен в ячейке памяти, адрес которой кратен размеру типа
источник

RS

Rusty Shackleford in Ассемблер
угу, а размер структуры итоговый кратность, 8 и 16 получается же ? ну по логике так должно быть
источник

A

Aleksandr in Ассемблер
так, до меня дошло
источник

s

s54816 in Ассемблер
Rusty Shackleford
с этим бы разобраться, вопрос собственно в том, что размер всей структуры должен быть кратен 8 в x64 или нет, соотвественно 7 байт дополнять нужно в конце, в примере выше, или нет )
Итоговый размер выравнивается по самому большому выравниванию в структуре. Т.е., если в структуре только char и short, то итоговый размер выравнивается до 2 байт, а если есть double, то до 8.
источник

RS

Rusty Shackleford in Ассемблер
s54816
Итоговый размер выравнивается по самому большому выравниванию в структуре. Т.е., если в структуре только char и short, то итоговый размер выравнивается до 2 байт, а если есть double, то до 8.
Ясно, спасибо!
источник

RS

Rusty Shackleford in Ассемблер
Rusty Shackleford
тоесть вот это, верно точно:
```
struct MixedData  /* After compilation in 32-bit x86 machine */
{
   char Data1; /* 1 byte */
   char Padding1[1]; /* 1 byte for the following 'short' to be aligned on a 2 byte boundary assuming that the address where structure begins is an even number */
   short Data2; /* 2 bytes */
   int Data3;  /* 4 bytes - largest structure member */
   char Data4; /* 1 byte */
   char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */
};
```
здесь получается int самый большой, по этому до 12 итоговый размер, всё сходится )
источник

RS

Rusty Shackleford in Ассемблер
Очередное дело закрыто! :))
источник

RS

Rusty Shackleford in Ассемблер
s54816
Итоговый размер выравнивается по самому большому выравниванию в структуре. Т.е., если в структуре только char и short, то итоговый размер выравнивается до 2 байт, а если есть double, то до 8.
а вот здесь из WSOCK32.inc:
struct strct_WSAData
 wVersion    dw ?
 wHighVersion  dw ?
 szDescription  db 256+1 dup (?)
 szSystemStatus  db 128+1 dup (?)
 iMaxSockets    dw ?
 iMaxUdpDg    dw ?
 _padding_    db 2 dup (?)
 lpVendorInfo                          dd ?
ends
зачем здесь паддинг 2 байта ?
ведь если предыдущее все сложить (2+2+257+129+2+2) будет 394, что кратно 4 и следующий член структуры четырехбайтовый lpVendorInfo    dd ? и так получается на своем месте ? и размер в итоге без паддинга тоже будет кратный 4м
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
это fasm?
источник

RS

Rusty Shackleford in Ассемблер
да
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮... in Ассемблер
макрос struct вроде сам должен выравнивать при необходимости
источник

RS

Rusty Shackleford in Ассемблер
Aiwan ╭∩╮ (òÓ,) ╭∩╮
макрос struct вроде сам должен выравнивать при необходимости
это не суть, нужно разобраться в тонкостях, как это руками сделать
источник

RS

Rusty Shackleford in Ассемблер
ааа я понял вроде
источник

RS

Rusty Shackleford in Ассемблер
во первых опять калькулятор виндовый подвел )))

394 ÷ 4 =
98.5
)))
источник

RS

Rusty Shackleford in Ассемблер
во вторых, lpVendorInfo это же lp - лонг поинт, тоесть кратность 8 получается в 64x системе
источник

RS

Rusty Shackleford in Ассемблер
но это  WSOCK32.INC фасма
; WSOCK32.DLL structures and constants

struct WSADATA
 wVersion   dw ?
 wHighVersion   dw ?
 szDescription  db 256+1 dup (?)
 szSystemStatus db 128+1 dup (?)
 iMaxSockets   dw ?
 iMaxUdpDg   dw ?
 _padding_   db 2 dup (?)
 lpVendorInfo   dd ?
ends
wsock32, не понятно как на 64х системе это все корректно работает, если там не dd должно быть получается в структуре а dq указатель на тип char *lpVendorInfo                          dd ?
источник

RS

Rusty Shackleford in Ассемблер
из msdn
typedef struct WSAData {
 WORD           wVersion;
 WORD           wHighVersion;
#if ...
 unsigned short iMaxSockets;
#if ...
 unsigned short iMaxUdpDg;
#if ...
 char           *lpVendorInfo;
#if ...
 char           szDescription[WSADESCRIPTION_LEN + 1];
#if ...
 char           szSystemStatus[WSASYS_STATUS_LEN + 1];
#else
 char           szDescription[WSADESCRIPTION_LEN + 1];
#endif
#else
 char           szSystemStatus[WSASYS_STATUS_LEN + 1];
#endif
#else
 unsigned short iMaxSockets;
#endif
#else
 unsigned short iMaxUdpDg;
#endif
#else
 char           *lpVendorInfo;
#endif
} WSADATA;
источник