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

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

  1. netex

    netex New Member

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

    IceStudent Active Member

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

    netex New Member

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

    n0name New Member

    Публикаций:
    0
    макрос?
     
  5. MSoft

    MSoft New Member

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

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

    Публикаций:
    0
    netex
    Не вижу связи.
     
  7. netex

    netex New Member

    Публикаций:
    0
    Ну как же? Я на форуме ответ даже нашел.

    При вызове функции 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
    netex
    Да, есть некоторые особые случаи, в которых выравнивание необходимо, но в основном никакие align'ы не нужны.