Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этой статье я познакомлю тебя с сегментной адресацией и сегментными регистрами, расскажу, как распределяется первый мегабайт оперативной памяти компьютера, затем мы обсудим получение прямого доступа к видеопамяти в текстовом режиме, а самое главное — поностальгируем по фильму «Хакер»! Под конец напишем психоделическую программу, которой позавидовали бы его герои.
Для начала разберемся, что такое сегментные регистры. Процессор 8088 умеет адресовать один мегабайт оперативной памяти, несмотря на то что регистры у него 16-битные. В норме 16 битами можно адресовать только 64 Кбайт. И как же тогда выкручивается 8088? Как ему удается адресовать целый мегабайт? Для этого в 8088 есть сегментные регистры! Четыре сегментных регистра: CS
, ES
, DS
и SS
, по 16 бит каждый. У каждого из этих регистров есть свое назначение.
Регистр CS
указывает на сегмент кода. Процессор обращается к CS
всякий раз, когда надо считать из памяти очередную инструкцию для выполнения.
Регистры DS
и ES
указывают на сегмент данных. К этим регистрам процессор обращается, когда выполняемая инструкция считывает или сохраняет данные. Имей в виду: DS
используется чаще, чем ES
. ES
обычно вступает в игру, когда ты обрабатываешь массивы данных, индексируя их регистром DI
.
Регистр SS
указывает на сегмент стека. К этому регистру процессор обращается, когда выполняет инструкции, взаимодействующие со стеком: push
, pop
, call
и ret
.
Значения, хранимые в сегментных регистрах, — это базовый адрес, поделенный на 16
. Если в CS
записано значение 0x0000
, процессор будет считывать инструкции из области памяти 0x00000 — 0x0FFFF
. Если в регистре CS
записано значение 0x1000
, то процессор будет считывать инструкции из области памяти 0x10000 — 0x1FFFF
.
Если тебе надо адресоваться в какой-то другой сегмент, а не тот, который будет задействован по умолчанию, напиши этот сегмент в префиксе к инструкции, которую используешь.
Поместить какое-то число в сегментные регистры напрямую нельзя. Для этого надо:
push/pop
;lds/les
.Процессор 8088 настолько лоялен, что позволит тебе даже вот такую инструкцию: pop cs
. Но только имей в виду, что это нарушит поток выполнения инструкций. В более новых процессорах, начиная с 80286, такую диверсию сделать уже не получится. И слава богу!
Ну вот вроде бы и все, что тебе надо знать о сегментных регистрах. Теперь ты с их помощью (в основном с помощью регистров DS
и ES
) можешь получать доступ ко всему первому мегабайту памяти ПК.
Понимание того, как распределяется память в ПК, поможет тебе делать разные интересные вещи.
Начало загрузки у всех компьютеров одинаковое: они сначала переходят в текстовый цветной режим 80x25
. К видеопамяти экрана, который работает в таком режиме, можно обращаться напрямую, через вот этот диапазон адресов: 0xB8000 — 0xB8FFF
.
Первый байт диапазона — это первый символ в верхнем левом углу экрана. Второй байт — это цвет фона под символом и цвет самого символа. Затем (третьим байтом) идет второй символ. И так для всех 25 строк по 80 символов каждая.
Перед тем как мы сможем напрямую обращаться к видеопамяти экрана, то есть без использования сервисов BIOS, надо задать нужный нам видеорежим.
В этом режиме видеопамять экрана доступна по адресу 0xB8000
. Теперь ты можешь легко получить доступ к ней. Примерно так, как в коде ниже.
Обрати внимание, что после того, как ты выполнил этот кусок кода, ты не сможешь обращаться к переменным, которые сохраняешь в сегменте кода, как мы это делали в примерах из прошлых уроков. Потому что DS
и ES
теперь нацелены не на сегмент кода, а на видеопамять.
Источник: xakep.ru