Главная /
Ассемблер /
Для чайников /
Введение в Ассемблер /
Сегментные регистры
|
Лучшие книги по Ассемблеру
Сделал подборку не новых, но проверенных книг по программированию на языке ассемблера. Если вы также как и я любите погружаться на низкий уровень, в те закоулки мира программирования, куда не всем путь открыт, то посмотрите. Возможно, что-то вам понравится.
Подробнее...
|
В реальном режиме процессора при записи адреса ячейки в памяти используется формат СЕГМЕНТ:СМЕЩЕНИЕ,
где СЕГМЕНТ - это номер сегмента (блока памяти), а СМЕЩЕНИЕ - это номер ячейки памяти относительно
начала сегмента. Почему так повелось, я рассказал здесь. А в этой статье расскажу о сегментации памяти и сегментных регистрах.
Сегментация памяти
В реальном режиме используется сегментная модель памяти. Суть её заключается в том, что вся память разделена на блоки по 64 КБ. Эти блоки и называются сегментами. У каждого сегмента есть свой адрес. Например, нулевой сегмент имеет адрес 0000. В пределах каждого сегмента каждая ячейка памяти (а в одной ячейке памяти может храниться один байт) также пронумерована, но уже относительно сегмента. Например:
0000:0000 - ячейка 0 в сегменте 0
0000:0001 - ячейка 1 в сегменте 0
0001:0000 - ячейка 0 в сегменте 1
0001:0015 - ячейка 21 в сегменте 1
Обратите внимание на последний пример. Почему ячейка номер 21? Да потому что все числа в
такой модели памяти представлены в шестнадцатеричной системе. То есть 15 в шестнадцатеричной - это 21 в десятичной.
Допустим, что у нас в разных сегментах записаны данные. Например, буквы:
0010:Привет,
0020:МИР!
Для каждого символа в памяти выделен один байт, и у каждого из этих байтов есть свой адрес. Мы можем прочитать байт, зная его адрес, или записать новое значение в этот адрес. В нашем примере, в сегментной модели памяти, у символов будут следующие адреса:
0010:0000 (П)
0010:0001 (р)
0010:0002 (и)
0010:0003 (в)
0010:0004 (е)
0010:0005 (т)
0010:0006 (,)
0020:0000 (М)
0020:0001 (И)
0020:0002 (Р)
0020:0003 (!)
Конечно, в реальной программе никто не будет размещать одну строку в разных сегментах.
Но это просто пример. Здесь мы знаем адрес каждого символа нашей строки.
Мы можем прочитать из памяти отдельный символ, или записать по данному адресу другой символ,
изменив таким образом строку. Например, если мы запишем в адрес
0020:0002
символ Г
, то в памяти у нас будет:
0010:Привет,
0020:МИГ!
Эта ячейка памяти смещена от начала сегмента на три байта. Но, поскольку нумерация начинается с 0
,
то мы записываем букву в байт номер 2
от начала смещения.
Таким образом получается, что для работы с памятью в реальном режиме нам надо знать два числа: адрес сегмента и адрес смещения.
Сегментные регистры процессора
Для хранения адресов сегментов используются сегментные регистры: CS, DS, SS, ES. Эти регистры используются для обращения к сегментам данных. Смещения могут храниться в других регистрах (но не в любых).
- Регистр CS (Code Segment - сегмент кода) используется для хранения сегмента кода программы. То есть в этом сегменте хранится код программы.
- Регистр DS (Data Segment - сегмент данных) используется для хранения данных программы.
- Регистр SS (Stack Segment - сегмент стека) используется для хранения сегмента стека.
- Регистр ES - дополнительный регистр, который может хранить адрес любого сегмента (например, видеобуфера). Именно этот регистр наиболее часто используется в программах для работы с памятью.
Для примера попробуем записать в регистр ES адрес сегмента 0020:
MOV ES, 0020h
Простое, казалось бы, решение. Но оно не работает! А всё почему? А потому что запись любого числа напрямую в сегментные регистры запрещена! Поэтому вместо одной команды приходится выполнять две:
MOV AX, 0020h
MOV ES, AX
то есть сначала записываем сегмент в регистр АХ, а только потом можно записать содержимое АХ в сегментный регистр.
На этом пока всё. Подключайтесь к группе Основы программирования в Телеграм, или к другим каналам (ссылки ниже), чтобы ничего не пропустить.
|
Первые шаги в программирование
Главный вопрос начинающего программиста – с чего начать? Вроде бы есть желание, но иногда «не знаешь, как начать думать, чтобы до такого додуматься».
У человека, который никогда не имел дело с информационными технологиями, даже простые вопросы могут вызвать большие трудности и отнять много времени на решение.
Подробнее...
|