Открытые сборки Watcom Inline Операторы SEG и OFFSET

Сегодня я узнал, что оператор SEG в MASM по умолчанию возвращает адрес GROUP, а не адрес СЕГМЕНТА данного выражения, и что есть опции и методы, чтобы переопределить это.

Поскольку я сейчас выполняю сложный проект в Open Watcom 1.9 / 16-bit DOS, где C и assembly (встроенная и автономная) смешиваются (на самом деле DOS требуется только для запуска, тогда моя собственная MINI-ОС принимает контроль), а так как я что WASM совместим с MASM, у меня есть следующий вопрос:

При выполнении встроенной сборки и взятии сегмента переменной оператор SEG возвращает GROUP или SEGMENT, в котором находится переменная?

Предположим, что есть GROUP с именем MY_GROUP, СЕГМЕНТ с именем MY_SEG, который принадлежит MY_GROUP, и переменная / метка с именем MY_VAR, которая помещается в MY_SEG.

Тогда, если я это сделаю

_asm { MOV AX, SEG MY_VAR } 

какое значение загружено в AX? Является ли это адресом MY_GROUP или адресом MY_SEG (учитывая, что они разные)?

Я не нашел ни одного переключателя командной строки, который относится к этой проблеме во встроенной сборке. Затем я попробовал синтаксис MASM:

 _asm { MOV AX, SEG MY_GROUP:MY_VAR MOV AX, SEG MY_SEG:MY_VAR } 

Обе приведенные выше строки приводят к следующей ошибке: «Разрешена только метка сегмента или группы».

Обратите внимание, что моя проблема связана только с встроенной сборкой. Фактически, я использую JWASM для автономных сборочных модhive, и синтаксис выше работает хорошо и с ожидаемыми результатами.

Может ли кто-нибудь сказать мне, что делает встроенный ассемблер в этой ситуации, и если есть средства, как я могу контролировать его поведение?

Большое спасибо!

    Я не думаю, что есть какой-то способ убедить компилятор OpenWatcom испускать групповое перемещение сегмента. Частью проблемы является то, что нет способа объявить или определить группу, чтобы вы могли ссылаться на нее в встроенной сборке.

    Тем не менее, похоже, что компоновщик OpenWatcom будет игнорировать тот факт, что репозиции основаны на сегментах и ​​вместо этого используют группу, к которой сегмент принадлежит базе. wlink что вы используете wlink тогда в первом примере AX будет загружен значением сегмента, указывающим на начало MY_GROUP. С другой стороны, если вы используете сегментированный компоновщик Microsoft, то AX будет содержать значение сегмента, которое указывает на MY_SEG.