Дело в следующем. 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) и смещения. Вопрос: в чем я туплю? Что не так делаю и чего не знаю? может сталкивался кто нить в чем то подобным?
Barbos Возможно, ассемблер пытается подставить значение сегмента для минимально возможного смещения. Например, если эта переменная находится в сегменте DATA16 по смещению 1000h, то он подсовывает DATA16+100h (смещение для доступа к переменной тогда равно нулю). Попробуй вместо SEG name_var загрузить всё же адрес самого сегмента, а после компоновки (линковки, как обычно выражаются, хоть это и не по-русски) посмотреть, какая константа грузится. Тогда станет понятно, как транслятор обрабатывает SEG имя_переменной.
А что врисовано в команде ASSUME? Команда SEG будет пытаться выбрать смещение сегмента относительно сегмента регистра ds (вроде бы так)
примерно так, но он прибавит не 100h, а 1000h, смещение как оно есть в чистом виде. Прикрепляю архив, там все есть, исходник, листинги, полученные masm и wdis, и сам исполняемый, транслированный masm, компонованый wlink. Я не в первый раз натыкаюсь на подобные глюки (если это глюки). Перед этим натыкался на разную трактовку одного и того же текста разными трансляторами.
Провел еще один эксперимент Трансляция и компоновка пакетом masm - все в порядке. Трансляция и компоновка пакетом watcom - все в порядке. Трансляция watcom, компоновка masm - все в порядке. Трансляция masm, компоновка watcom - вот только в этом случае вылезает злобный глюк! Щас еще попробую сравнить OBJты, генерируемые masm и wasm.
да, в генерируемых OBJ есть отличия. Но дело в том, что мелкомягкий линкер одинаково хорошо справляется с обеими, в то время как линкер watcoma творит чушь. Вобщем, от последнего я решил отказаться. Сборку проекта буду делать мелкомягким. Wasm тоже решил оставить в стороне после того как он мне попортил нервы с директивой equ. watcom пока что буду использовать для трансляции сишных текстов. До них пока еще не добрался.