Выравнивание переменных

Тема в разделе "WASM.BEGINNERS", создана пользователем netex, 30 авг 2007.

  1. netex

    netex New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    114
    Адрес:
    Russia
    Многие наверное сталкивались с ошибкой в винде ERROR_NOACCESS из-за отсутствия выравнивания переменных.
    Собственно вопрос: Как выравнить все переменные в секции .data?
    У меня их 100 штук и перед каждой писать align 4 не серьезно.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Если переменные кратны 4м, то align 4 не нужен)
    А вообще - поступи как компилятор: сгруппируй переменные по размеру.
     
  3. netex

    netex New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    114
    Адрес:
    Russia
    Сгрупировать это интересно, но хотелось бы что бы каждая новая переменная была выровнена автоматически.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    макрос?
     
  5. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Я что-то пропустил? Можно чуть подробнее - что за проблема? Я впервые о таком слышу и хотелось бы узнать побольше
     
  6. Quantum

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

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

    netex New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    114
    Адрес:
    Russia
    Ну как же? Я на форуме ответ даже нашел.

    При вызове функции LookupPrivilegeValue и AdjustTokenPrivileges
    Последняя вылетает с кодом ошибки ERROR_NOACCESS если аргументы не выровнены по границе 4 байта.

    http://www.wasm.ru/forum/viewtopic.php?id=15071
    http://www.wasm.ru/forum/viewtopic.php?id=15319

    вот код:
    Код (Text):
    1. .data
    2. align 4
    3. NtdllDLL    db  "ntdll.dll",0
    4.  
    5. align 4
    6. Advapi32    db  "Advapi32.dll",0
    7.  
    8.  
    9. align 4
    10. PrivTakeOwnership   db  "SeTakeOwnershipPrivilege",0
    11. align 4
    12. PrivTcb db  "SeTcbPrivilege",0
    13. align 4
    14. PrivChangeNotify    db  "SeChangeNotifyPrivilege",0
    15. align 4
    16. PrivIncreaseQuota   db  "SeIncreaseQuotaPrivilege",0
    17. align 4
    18. PrivAssignPrimToken db  "SeAssignPrimaryTokenPrivilege",0
    19. align 4
    20. PrivCreateToken db  "SeCreateTokenPrivilege",0
    21. align 4
    22. PrivDebug   db  "SeDebugPrivilege",0
    23.  
    24. align 4
    25. UserName    db  "Petya",0
    26.  
    27. align 4
    28. startInfo   STARTUPINFO <0>
    29. align 4
    30. processInfo PROCESS_INFORMATION <0>
    31.  
    32.  
    33. align 4
    34. temp    dd  0
    35.  
    36. align 4
    37. oa  OBJECT_ATTRIBUTES       <sizeof(OBJECT_ATTRIBUTES), 0, 0, 0, 0, 0>
    38.  
    39. align 4
    40. MyToken dd  0
    41.  
    42. .code
    43. main proc
    44.    
    45.    
    46.     local   CurrProcessHandle:DWORD
    47.     local   CurrProcessToken:DWORD
    48.     local   ntdllHandle:DWORD
    49.     local   advapi32Handle:DWORD
    50.  
    51.    
    52. ll:
    53.     mov ecx,2
    54.     loop    ll
    Если нужно выровнить все переменные в секции .data то приходиться писать align 4 перед каждой. Это очень не удобно.

    Задача такая: Нужно начальные адреса всех переменных, независимо от того кратны они по размеру 4 или нет, выровнить по границе 4 байта.

    В идеале код выглядел бы так:
    Код (Text):
    1. .data
    2. [b]ALIGN_ALL 4[/b]
    3. NtdllDLL    db  "ntdll.dll",0
    4. Advapi32    db  "Advapi32.dll",0
    5. PrivTakeOwnership   db  "SeTakeOwnershipPrivilege",0
    6. PrivTcb db  "SeTcbPrivilege",0
    7. PrivChangeNotify    db  "SeChangeNotifyPrivilege",0
    8. PrivIncreaseQuota   db  "SeIncreaseQuotaPrivilege",0
    9. PrivAssignPrimToken db  "SeAssignPrimaryTokenPrivilege",0
    10. PrivCreateToken db  "SeCreateTokenPrivilege",0
    11. PrivDebug   db  "SeDebugPrivilege",0
    12. UserName    db  "Petya",0
    13. startInfo   STARTUPINFO <0>
    14. align 4
    15. processInfo PROCESS_INFORMATION <0>
    16.  
    17. ...
    Главное чтобы не нужно было перед каждой переменной писать align 4
     
  8. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    netex
    Да, есть некоторые особые случаи, в которых выравнивание необходимо, но в основном никакие align'ы не нужны.