Содержание статьи
Другие статьи курса
- Зачем учить ассемблер в 2020 году
- Делаем первые шаги в освоении асма
- Осваиваем арифметические инструкции
- Как работают переменные, режимы адресации, инструкции условного перехода
- Работаем с большими числами и делаем сложные математические вычисления
- Сокращаем размер программы
- Пишем клон игры Flappy Bird, который уместится в бутсектор
- Пишем бейсик и умещаем его в 512 байт
Знакомимся с сегментными регистрами
Для начала разберемся, что такое сегментные регистры. Процессор 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 символов каждая.
INFO
Исторический факт. IBM PC образца 1981 года поставлялся в двух модификациях: с монохромным режимом и с цветным режимом. Тогдашним разработчикам игрушек приходилось придумывать разные эвристики, чтобы понять, какая у компьютера графика — монохромная или цветная. Несколько старых добрых игрушек для этого писали какую-нибудь цифру по адресу 0xB8000
и считывали ее обратно, чтобы узнать, в каком режиме сейчас идет работа — в цветном или в монохромном.
Прямой доступ к видеопамяти в текстовом режиме
Перед тем как мы сможем напрямую обращаться к видеопамяти экрана, то есть без использования сервисов BIOS, надо задать нужный нам видеорежим.
В этом режиме видеопамять экрана доступна по адресу 0xB8000
. Теперь ты можешь легко получить доступ к ней. Примерно так, как в коде ниже.
Обрати внимание, что после того, как ты выполнил этот кусок кода, ты не сможешь обращаться к переменным, которые сохраняешь в сегменте кода, как мы это делали в примерах из прошлых уроков. Потому что DS
и ES
теперь нацелены не на сегмент кода, а на видеопамять.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»