2.1.2. Сегментные регистры

При использовании сегментированных моделей памяти для формирования лю­бого адреса нужны два числа - адрес начала сегмента и смещение искомого байта относительно этого начала (в бессегментной модели памяти flat адреса начал всех сегментов равны). Операционные системы (кроме DOS) могут размещать сегмен­ты, с которыми работает программа пользователя, в разных местах памяти и даже временно записывать их на диск, если памяти не хватает. Так как сегменты способ­ны оказаться где угодно, программа обращается к ним, применяя вместо настоя­щего адреса начала сегмента 16-битное число, называемое селектором. В процес­сорах Intel предусмотрено шесть 16-битных регистров - CS, DS, ES, FS, GS, SS, где хранятся селекторы. (Регистры FS и GS отсутствовали в 8086, но появились уже в 80286.) Это означает, что в любой момент можно изменить параметры, запи­санные в этих регистрах.

Вреальном режиме селектор каждого сегмента равен адресу его начала, де-П^О ленному на 16. Чтобы получить адрес в памяти, 16-битное смещение скла­дывают с этим селектором, предварительно сдвинутым влево на 4. Таким

образом, оказывается, что максимальный доступный адрес в реальном ре­жиме 220 - 1 = 1 048 575. Для сравнения: в защищенном режиме адрес нача­ла для каждого сегмента хранится так что возможно (64 Тб) различныхлогических адреса в формате сегментхмещение (программа оп­ределяет до 16383 сегментов, каждый из которых до 4 Тб), хотяреалъно процессор адресуется только к 4 или 64 (для Pentium Pro) Тб памяти.

В отличие от DS, ES, GS, FS, которые называются регистрами сегментов дан­ных, CS и SS отвечают за сегменты двух особенных типов - сегмент кода и сегмент стека. Первый содержит программу, исполняющуюся в данный момент, следова­тельно, запись нового селектора в этот регистр приводит к тому, что далее будет исполнена не следующая по тексту программы команда, а команда из кода, нахо­дящегося в другом сегменте, с тем же смещением. Смещение очередной выпол­няемой команды всегда хранится в специальном регистре EIP (указатель инст­рукции, 16-битная форма IP), запись в который также приведет к тому, что далее будет исполнена какая-нибудь другая команда. На самом деле все команды пере­дачи управления - перехода, условного перехода, цикла, вызова подпрограммы и т. п. - и осуществляют эту самую запись в CS и EIP.