tommi-boy писал(а):
Уважаемый SII, хотелось бы заметить что для формирования адреса используются два регистра, хоть в реальном режиме, хоть в нереальном. В реальном же режиме адрес получается как регистр сегмента сдвинутый на 4 бита влево + регистр смещения, таким образом заполняется шина на 20 разрядов. о каких 16 идёт речь? я указал 20тибитный адрес значит он должен первые 16 поместить в сегмент а последние 4 в смещение. я понимаю это так.
Понимаете и правильно, и неправильно одновременно. Компилятор никому ничего не должен, если это не прописано явным образом в стандарте языка или в документации на компилятор (если прописано, но не делает -- это ошибка в компиляторе, но если не прописано, то он и не должен делать).
Вы же, похоже, смешиваете два понятия -- указатель и адрес ячейки памяти. На самом деле это разные вещи, только об этом нередко либо забывают, либо вообще не знают (прямое указание на этот факт я находил только в спецификации Ады; правда, там нет указателей в привычном понимании, а есть ссылочные типы, но сути это не меняет). Вы в своей программе задаёте не правильное значение указателя, а обычную 32-разрядную целую константу. То, что Вы её приводите к типу указателя, ещё не означает, что она будет преобразована в него правильным (с Вашей точки зрения) образом -- тут надо изучать документацию на компилятор и стандарт языка (поскольку я Си без крайней надобности не использую, то наизусть этих вещей не знаю).
Во времена ДОС, помнится, значения дальних указателей (т.е. состоящие из пары 16-разрядных значений сегмент:смещение, а не из одного только 16-разрядного смещения, которое использовалось совместно со стандартным значением сегмента данных или кода) задавались в явном виде -- т.е. отдельно сегмент, отдельно смещение; соответственно, компилятору ни о чём думать не приходилось. Как сейчас -- не знаю; как правильно заметил Чиж, надо изучать документацию на конкретный компилятор.