Проблема с выравниванием

Тема в разделе "WASM.BEGINNERS", создана пользователем deathwisher, 29 окт 2006.

  1. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Такая проблема возникла - никогда с ней не сталкивался:
    При использовании выравнивания align 10h в .data

    masm выдает:
    error A2189: invalid combination with segment alignment : 16

    Вот подробный код:

    off_417498 dd offset sub_40F6C0
    align 10h
    dd 40008h, 40F17Bh, 50004h, 80010h, 40F17Bh, 60004h, 200020h
    dd 40F17Bh, 40004h, 100010h, 40EAB0h, 100008h, 200020h
    dd 40EAB0h, 100008h, 800080h, 40EAB0h, 200008h, 1000080h
    dd 40EAB0h, 800020h, 4000102h, 40EAB0h, 1020020h, 10000102h
    dd 40EAB0h

    как можно исправить эту проблему?
     
  2. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    используй выравнивание 16
     
  3. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    а это не одно и тоже ?

    вообще интересно в чем заключается проблема, и как ее лучше решить
     
  4. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    deathwisher
    значение выравнивания в align должно быть <= выравнивания текущего сегмента. По умолчанию, выравнивание .data = 4. Нужно задать выравнивание сегмента вручную (без использования директивы .data, а прямо через SEGMENT).
     
  5. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    а подробнее можно?
    это задается через командную строку как параметр компилятора\линкера ?
     
  6. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    deathwisher
    Код (Text):
    1. _data1 segment para
    2. abcdef dd 5
    3. align 16
    4. ghijk dd 3
    5. _data1 ends
    Тут para - это 16 байт, т.е. параграф. Получаем сегмент с именем _DATA1.
     
  7. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    спасибо, посмотрю как это будет работать
    а на .code это не повлияет?
     
  8. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Нет. Свойства сегмента не распространяются на другие сегменты.
     
  9. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Всё гораздо проще решается - достаточно в masm'е писать директиву процессора постарше семейством - .586 например и будет доступно выравнивание по большИм границам
     
  10. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    asmfan
    Достаточно и 486 чтобы сегмент _text по умолчанию выравнивался на границу параграфа. Кстати, при совмещении секций (да и просто одноимённых сегментов из разных обьектников) из-за этого возникают большие дыры на стыке. Поэтому имеет смысл использовать 386 и задавать выравнивание вручную там, где это действительно нужно, IMHO.