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

Discussion in 'WASM.BEGINNERS' started by deathwisher, Oct 29, 2006.

  1. deathwisher

    deathwisher New Member

    Blog Posts:
    0
    Joined:
    May 20, 2006
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Aug 15, 2005
    Messages:
    277
    используй выравнивание 16
     
  3. deathwisher

    deathwisher New Member

    Blog Posts:
    0
    Joined:
    May 20, 2006
    Messages:
    36
    а это не одно и тоже ?

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

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

    Blog Posts:
    0
    Joined:
    Jan 6, 2003
    Messages:
    3,143
    Location:
    Ukraine
    deathwisher
    значение выравнивания в align должно быть <= выравнивания текущего сегмента. По умолчанию, выравнивание .data = 4. Нужно задать выравнивание сегмента вручную (без использования директивы .data, а прямо через SEGMENT).
     
  5. deathwisher

    deathwisher New Member

    Blog Posts:
    0
    Joined:
    May 20, 2006
    Messages:
    36
    а подробнее можно?
    это задается через командную строку как параметр компилятора\линкера ?
     
  6. Quantum

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

    Blog Posts:
    0
    Joined:
    Jan 6, 2003
    Messages:
    3,143
    Location:
    Ukraine
    deathwisher
    Code (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

    Blog Posts:
    0
    Joined:
    May 20, 2006
    Messages:
    36
    спасибо, посмотрю как это будет работать
    а на .code это не повлияет?
     
  8. Quantum

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

    Blog Posts:
    0
    Joined:
    Jan 6, 2003
    Messages:
    3,143
    Location:
    Ukraine
    Нет. Свойства сегмента не распространяются на другие сегменты.
     
  9. asmfan

    asmfan New Member

    Blog Posts:
    0
    Joined:
    Jul 10, 2006
    Messages:
    1,004
    Location:
    Abaddon
    Всё гораздо проще решается - достаточно в masm'е писать директиву процессора постарше семейством - .586 например и будет доступно выравнивание по большИм границам
     
  10. Quantum

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

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