директива SEG

Тема в разделе "WASM.ASSEMBLER", создана пользователем Barbos, 13 ноя 2007.

  1. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    Дело в следующем.
    DOS, реальный режим.
    Набранный текст компилирую MASMом, полученный OBJ линкую уже в ваткоме. В тексте присутствует строка "mov AX,SEG name_var", т.е. я хочу получить адрес сегмента, в котором содержится переменная name_var (сегмент я назвал DATA16). Получается ерунда. В листинге, полученном из скомпилированного OBJ строки "mov AX,DATA16" и "mov AX,seg name_var" выглядят абсолютно одинаково, независимо от того, чем был получен листинг (при компиляции MASMом или с помощью wdis), но в сгенерированном коде есть отличия. При линковке в том же MASMе все проходит отлично. Делал эксперименты, менял значения. Все выглядит так, будто на место "seg name_var" ставится сумма адреса сегмента (без умножения на 16) и смещения. Вопрос: в чем я туплю? Что не так делаю и чего не знаю? может сталкивался кто нить в чем то подобным?
     
  2. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Barbos

    Возможно, ассемблер пытается подставить значение сегмента для минимально возможного смещения. Например, если эта переменная находится в сегменте DATA16 по смещению 1000h, то он подсовывает DATA16+100h (смещение для доступа к переменной тогда равно нулю). Попробуй вместо SEG name_var загрузить всё же адрес самого сегмента, а после компоновки (линковки, как обычно выражаются, хоть это и не по-русски) посмотреть, какая константа грузится. Тогда станет понятно, как транслятор обрабатывает SEG имя_переменной.
     
  3. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    А что врисовано в команде ASSUME? Команда SEG будет пытаться выбрать смещение сегмента относительно сегмента регистра ds (вроде бы так)
     
  4. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    примерно так, но он прибавит не 100h, а 1000h, смещение как оно есть в чистом виде.
    Прикрепляю архив, там все есть, исходник, листинги, полученные masm и wdis, и сам исполняемый, транслированный masm, компонованый wlink. Я не в первый раз натыкаюсь на подобные глюки (если это глюки). Перед этим натыкался на разную трактовку одного и того же текста разными трансляторами.
     
  5. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    Провел еще один эксперимент
    Трансляция и компоновка пакетом masm - все в порядке.
    Трансляция и компоновка пакетом watcom - все в порядке.
    Трансляция watcom, компоновка masm - все в порядке.
    Трансляция masm, компоновка watcom - вот только в этом случае вылезает злобный глюк!
    Щас еще попробую сравнить OBJты, генерируемые masm и wasm.
     
  6. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    да, в генерируемых OBJ есть отличия. Но дело в том, что мелкомягкий линкер одинаково хорошо справляется с обеими, в то время как линкер watcoma творит чушь. Вобщем, от последнего я решил отказаться. Сборку проекта буду делать мелкомягким. Wasm тоже решил оставить в стороне после того как он мне попортил нервы с директивой equ. watcom пока что буду использовать для трансляции сишных текстов. До них пока еще не добрался.