Каковы максимальные и минимальные размеры сегмента на 8086?
Каков минимальный и максимальный размер сегмента на 8086? И из-за минимума, какое максимальное количество отдельных сегментов мы можем иметь? нет необходимости, чтобы все были активны одновременно. (перекрытие приемлемо)
4 ответа
Сегментные регистры 8086 являются 16-битными, поэтому может быть 65536 сегментов, но они перекрываются. 20-битный физический адрес получается путем сдвига регистра сегмента влево на 4 бита и добавления смещения адреса. Это означает, что сегмент может начинаться с любого 16-байтового выравнивания. Из перекрытия следует, что существует много способов добавить одну ячейку памяти, например 0000:0010
а также 0001:0000
адрес в том же месте.
Поскольку смещение адреса также составляет 16 бит, адресуемый размер любого сегмента составляет 65536 байтов. Таким образом, максимальный размер сегмента составляет 65536 байтов, а наименьший - 16 байтов - хотя на 8086 весь сегмент может быть прочитан / записан без защиты.
Ваш последний вопрос "максимальное количество отдельных сегментов" составляет 16 отдельных сегментов. Больше и они будут пересекаться.
Максимальный размер каждого сегмента составляет 64 КБ, поскольку смещение составляет 16 бит, поэтому каждый сегмент имеет 2^16 байт = 64 КБ. минимальный размер сегмента - 16B.
В реальном режиме сегменты не имеют "размера": память не разделяется на сегменты в real mode
, Сегмент является частью более крупного объекта: segment+offset
- которые оба используются для расчета эффективного адреса. Это и сегмент, и смещение, которые позволяют процессору вычислять адрес байта памяти, а байт - это минимальная единица измерения, которую можно адресовать на платформе Intel. О "сегмент + смещение" программисты также говорят, что они составляют “far pointer”
, Наоборот, “near pointer”
является относительным указателем по сравнению с другим указателем, который имеет одинаковый сегмент. Таким образом, "дальний" указатель является указателем, состоящим из 16-разрядного селектора сегмента и 16-разрядного (или 32-разрядного, в зависимости от режима) смещения, поэтому общий размер дальнего указателя был 32-разрядным в 16-разрядном и 48-битный режим в 32-битном режиме. Селектор сегмента загружается в специальный регистр сегмента перед доступом к памяти из "дальнего" указателя. Есть специальные инструкции для загрузки дальнего указателя сразу. На Intel 8086
Самые популярные инструкции были LDS
а также LES
, которые загружают "дальний" указатель из памяти на пару регистров: один сегментный регистр (DS
или же ES
) и один общий (смещенный) регистр. Есть также версии для других регистров: LFS
, LGS
а также LSS
за FS
, GS
а также SS
сегментные регистры соответственно (введены в Intel 80386
). Сегменты чрезвычайно полезны в 16-битном режиме, будь то 16-битный реальный режим или 16-битный защищенный режим. В 16-битном реальном режиме значение регистров сегмента умножалось на 16, а затем добавлялось смещение - так рассчитывался эффективный адрес. Но, опять же, поскольку память в реальном режиме не была "сегментирована", не было ни минимального, ни максимального размера сегмента. В 16-битном реальном режиме, если вы загружаете FFFF в регистры DS и SI, вы можете теоретически получить доступ (16 * 0xFFFF) + FFFF = 1114096- й байт памяти (некоторые практические ограничения применяются, например, так называемые A20-line
и т.д.) - или около 1 мегабайта.
Под 32-bit mode
почти нет необходимости в сегментных регистрах, поскольку все регистры сегментов по существу указывают на одни и те же местоположения, поэтому нет необходимости загружать регистры сегментов.
Под 64-bit modes
Эти инструкции не реализованы, их код операции дал нарушения прав доступа. Со времени внедрения Intel VEX
- "векторные расширения - (SSE2
), Intel взяла свои коды операций LDS
а также LES
и начал использовать их для VEX
префиксы. В результате 256-битный AVX
(YMM
) регистры доступны только в 64-битном режиме.
В protected mode
существует такое понятие, как размер сегмента, но, опять же, минимальный размер отсутствует, или минимальный размер был минимальной единицей выделения архитектуры, например, 16 байт 16-bit mode
или 4 килобайта в 32-bit mode
, В защищенном режиме регистр сегмента содержит не значение, умноженное на 16, как в 16-битном реальном режиме, а индекс в таблице селекторов. С момента появления Intel 80286's protected mode
, расширяет адресное пространство процессора примерно с 1 мегабайта до 224 байтов (16 мегабайт), но не за счет использования больших смещений. Вместо этого 16-битные регистры сегментов теперь содержат индекс в таблице дескрипторов сегментов, содержащих 24-битные базовые адреса, к которым добавляется смещение. Максимальный размер сегмента составил 64 килобайта. в Intel 80386
и в более поздних процессорах защищенный режим сохраняет механизм сегментации защищенного режима 80286, но модуль разбиения на страницы был добавлен в качестве второго уровня преобразования адресов между модулем сегментации и физической шиной. Кроме того, важно, что смещения адресов являются 32-разрядными (вместо 16-разрядных), а база сегмента в каждом дескрипторе сегмента также является 32-разрядной (вместо 24-разрядной). В результате максимальный размер сегмента был увеличен до теоретического максимума 4 ГБ. Интересно, что вопреки распространенному мнению, для 32-разрядных операционных систем не существует физического ограничения в 4 ГБ. Например, 32-разрядные серверные операционные системы, такие как 32-разрядная версия Microsoft Windows Server 2008, могут получить доступ к 64 ГБ (выпуски Windows Server 2008 Enterprise и Datacenter) - с помощью расширения физических адресов (PAE), которое впервые было представлено Intel в Pentium Pro, а затем AMD в процессоре Athlon - он определяет иерархию таблиц страниц из трех уровней с записями в таблице по 64 бита вместо 32, что позволяет этим ЦП напрямую обращаться к физическому адресному пространству размером более 4 гигабайт - так теоретически 32-разрядная ОС может получить теоретический доступ к 2^64 байтам или 17 179 869 184 гигабайтам, но сегмент ограничен 4 ГБ.
Максимальный размер 64K. Там нет минимума - вы можете использовать только первый байт, но сегмент всегда 64 КБ. Возможно, исключением являются последние сегменты - последний (0xFFFF) составляет 16 байтов, а последний - 32, 48, 64 байта... Обычно 8086 сегментов - это метод для адресации более 64 КБ с 16-битными адресными регистрами.
В микропроцессоре 8086 общая возможность адресации памяти составляет 1 МБ. Для представления 1 МБ требуется минимум 4 шестнадцатеричных числа, т.е. 20 бит. Микропроцессор 8086 имеет четырнадцать 16-битных регистров (т.е. нет регистров для представления 20-битного адреса). Таким образом, общая память может быть разделена на 16 отдельных логических сегментов, а емкость каждого сегмента составляет 64 КБ (т.е. 16 * 64 KB = 1MB
).