Сегодня я узнал, что оператор 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.