Четвертый BORLAND С++ и его окружение

       

Указатели


Хотя указатель или функция могут иметь конкретный тип независимо от используемой модели, вы можете выбрать заданный по

умолчанию тип указателя, используемый для кода и данных. Существует 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 автоматически циклически возвращаются каждые 16 байт, но настраивается также и сегмент. Например, при инкрементации 811B:000F результатом будет 811C:0000. Это обеспечивает,

    что, например, при наличии массива структур типа huge >

    64К индексирование массива и выбор поля struct будет работать для структур любого размера.

  • Однако работа с указателями huge связана с дополнительными

    издержками. Из-за этого арифметические операции с указателями huge выполняются намного медленнее, чем с указателями far.



    Содержание раздела