%20%D0%B2%20%D0%BA%D0%BE%D0%BD%D0%B5%D1%86%20%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%B0%20%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B0%2C%20%D1%87%D1%82%D0%BE%D0%B1%D1%8B%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B0%D0%B4%D1%80%D0%B5%D1%81%20%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20%D0%B2%20%D1%84%D0%B8%D0%B7%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%3F%20.png)
Почему нам нужно найти адрес в памяти, в котором есть 20 бит свободного пространства, из которых 16 бит предназначены для сегментного регистра и 4 «нулевых» бита?
Например, если регистр CS равен 346AH, то сегмент кода в основной памяти будет равен 346A0H, что составляет 20 бит. Зачем мы это делаем?
Сегменты памяти имеют размер 64 Кбайт (?), что происходит с оставшимся пространством, помимо этих 20 бит?
Извините, я не очень хорош в архитектуре компьютеров!
решение1
Например, если регистр CS равен 346AH, то сегмент кода в основной памяти будет равен 346A0H, что составляет 20 бит. Зачем мы это делаем?
Видимо, вы имеете в видусегментация x86, как изначально использовалось в процессорах Intel 8086/88. Этот тип "сегмента" не является универсальным. Существуют и другие определения памяти "сегменты".
В историческом контексте, вам нужно понимать, что кремниевая и (ферритовая) память раньше были очень дорогими. Чтобы противостоять дорогим мэйнфреймам,миникомпьютерпоявились в 1970-х годах, чтобы обеспечить недорогой компьютер. Этот акцент на низкой стоимости обычно означал 16-битную адресную шину (например, DEC PDP, Data General Nova, HP 21xx) и до 64 КБ памяти. Но по мере роста требований к системе часто требовалось больше памяти.
Были разработаны схемы памяти, которые могли по-прежнему использовать существующие 16-битные адреса, но при этом иметь доступ к большему объему памяти.
Наиболее распространенным методом расширения емкости памяти 64 КБ с 16-битными адресами было использование банков памяти, т. е. фактические старшие биты эффективного адреса памяти задаются банковским регистром. Основное преимущество использования банков памяти заключается в том, что его можно реализовать в подсистеме памяти (т. е. вне ЦП) и, следовательно, модернизировать для любого ЦП.
С появлением микропроцессоров системы, использующие 16-битную адресацию (например, Intel 8051, Zilog Z80), имели тенденцию развиваться аналогичным образом, т. е. включать банковую память.
Сегментная адресация, используемая Intel x86 (и по крайней мере еще одной известной мне системой), интегрирована с процессором и, следовательно, более универсальна.
В то время как банк памяти может занимать только фиксированную область в исходном пространстве памяти, сегменты x86 предоставляют доступ к расширенному 20-битному адресному пространству с использованием 16-битного смещения в сочетании со спецификацией сегментного регистра.
Адрес сегмента x86 на самом деле является 20-битным адресом, усеченным всего до 16 адресных битов.
Этот сегмент может начинаться с любого абзаца (адрес по модулю 16 равен нулю).
Отсюда необходимость присоединения четырех усеченных нулевых битов для получения фактического начала сегмента x86 в 20-битном пространстве памяти.
В зависимости отмодель памяти x86, программное обеспечение x86 могло использовать в основном 16-битные «адреса» (как и старое программное обеспечение), но могло получать доступ к большему объему эффективной памяти, чем старое программное обеспечение с 16-битными адресами.
Сегменты IOW x86 представляли собой метод расширения аппаратного обеспечения до 20-битной адресной шины, но позволяли программному обеспечению использовать в основном 16-битные «адреса» и не требовали 20-битной арифметики (т. е. 20-битных регистров и данных).