Указатели
Хотя указатель или функция могут иметь конкретный тип независимо от используемой модели, вы можете выбрать заданный по
умолчанию тип указателя, используемый для кода и данных. Существует 4 типа указателей: near (16 бит), far (32 бита), huge (32
бита) и segment (16 бит).
В указателях near (ближние указатели) для вычисления адреса
используется один сегментный регистр, например, 16-битовое значение указателя функции складывается со сдвинутым влево содержимым
регистра кода CS. С такими указателями легко работать.
Указатели far (дальние указатели) содержат не только смещение в сегменте, но и адрес сегмента (другое 16-битовое значение).
Такие указатели позволяют иметь несколько сегментов кода и программы, превышающие по размеру 64К. Здесь нужно учитывать, что в
операциях == и != используются 32-битовые значения unsigned long,
а не полный адрес памяти. В операциях сравнения <=, >=, < и > используется только смещение.
При прибавлении к указателю значения изменяется только смещение. Если смещение превышает FFFF (максимально возможное значение), то указатель возвращается к началу сегмента. При сравнении
указателей лучше использовать ближние указатели или указатели huge.
Указатели huge также занимают 32 бита. Аналогично указателям
far, они содержат и адрес сегмента и смещение. Однако, чтобы избежать проблем с указателями, такие указатели нормализуются. Нормализованный указатель - это 32-битовый указатель с максимально
возможным значением в сегментном адресе. Так как сегмент может
начинаться с каждых 16 байт, это означает, что данное смещение
будет иметь значение от 0 до 15. Для нормализации указателя он
конвертируется в 20-битовый адрес, а затем используются правые 4
бита смещения и левые 16 бит адреса сегмента. Например, 2F84:0532
преобразуется в абсолютный адрес 2FD72, который нормализуется в
2FD7:0002. Нормализация важна по следующими причинам:
одна возможная адресная пара "сегмент:смещение". Это означает, что операции == и != возвращают корректный ответ.
полные 32-битовые значения. Нормализация обеспечивает корректность результатов.
что, например, при наличии массива структур типа huge >
64К индексирование массива и выбор поля struct будет работать для структур любого размера.
Однако работа с указателями huge связана с дополнительными
издержками. Из-за этого арифметические операции с указателями huge выполняются намного медленнее, чем с указателями far.