Сегментные регистры, трансляция сегментов
Адрес объекта в сегментированной памяти задается 2 компонентами:
1) базовым адресом сегмента:
- косвенно (в связке с bx или bp),
- явно - в префиксе замены сегмента;
2) смещением в сегменте.
CPU i86 содержит 4 сегментных регистра по 2 байта:
Регистр |
Регистр задает |
Назначение |
CS |
сегмент кода |
выборка команд, адреса которых задаются ip |
SS |
сегмент стека |
выборка данных, адреса которых задаются базой bp |
DS |
сегмент данных |
выборка данных, адреса которых задаются базой bx |
ES |
дополнительный сегмент данных |
в командах обработки строк |
Можно обращаться к другим сегментам:
- существует 16 сегментов;
- но одновременно можно использовать только 4;
- применяются команды перегрузки сегментных регистров:
- команду MOV,
- команды загрузки сегментных регистров (LES, LDS и LSS).
Значения указателя стека sp и сегментного регистра SS:
- должны быть четными;
- так как работа со стеком выполняется переменными, кратными 2.
Преобразование математической адреса в линейный адрес выполняется по формуле (процедура трансляции адреса) (рис.4):
"линейный адрес" ←
← "значение сегмента" × 16 + "адрес операнда в сегменте",
где
"адрес операнда в сегменте" ←
← "B (база)" + "X (индекс)" + "disp (смещение)",
B, X, disp - компоненты адреса аргумента текущей команды.
0
Получение ячейки памяти при косвенной адресации
Для разных смещений используются обозначения:
- disp - смещение в сегменте относительно параметров B и X;
- offset - полное смещение в сегменте;
- линейный адрес - полный адрес в физической памяти.
Существует проблема трансляции сегментов:
- связана с 20-ти адресной шиной;
- старший сегмент размешается по адресу 220 -24 -1;
- может содержать только 16 байт;
- обращение к большим адресам автоматически будет переадресовано в 0-й сегмент (к 0-му адресу);
- при эмуляции CPU i86 используется программный "заворот".
В CPU i86 виртуальная память не реализована.
Указатель команд ip
- 16-ти разрядный регистр-счетчик,
- вычисляющий адрес команды в сегменте CS по длине предыдущей команды;
- прямое изменение невозможно;
- можно изменять косвенно:
- в командах передачи управления,
- при сохранении/восстановления контекста ПО через стек.
Регистр флагов cpu
16-ти разрядный регистр Flags содержит:
- управляющие сигналы CPU;
- флаги для условных команд передач управления:
- CF - арифметический перенос в старшие разряды,
- PF - результат кратен 2-м (чётен),
- ZF - нулевой результат,
- SF - знак результата (отрицательный ли результат),
- OF - переполнение,
- TF - остановка после каждой команды при отладке,
- IF - разрешение прерывания,
- DF - направление обработки строк.
