Вы смешиваете два разных термина.В режиме REAL x86 использует регистры сегментов и вычисляет 20-битный адрес следующим образом:
address = (segment_register << 4) + Offset
В режиме PROTECTED (как 16-битном, так и 32-битном) регистры сегмента удерживают селекторы до 64k /4 ГБ блоков памяти и адрес рассчитывается следующим образом:
address = selector_table[segment_register] + offset
В операционных системах, которые используют 32-битный и 64-битный защищенный режим, ОС обычно сохраняет ES = DS = GS = SS и использует только32- или 64-битное смещение в адресной памяти.
Если ваш код основан на вычислениях адреса в реальном режиме, его необходимо будет полностью переписать для защищенного режима.Однако, если он был написан для 16-разрядного защищенного режима, то он все равно потребует значительных изменений, но меньше, чем в первом случае.
Возвращаясь к вашему вопросу - VS2010 не ограничивает способ написаниякод, ОС делает.Изменение значения регистров сегмента в защищенном режиме может привести к нарушению привилегий.Кроме того, переопределения сегментов (например, ES: [DI]) не нужны, поскольку все регистры сегментов содержат одинаковое значение.