Главная страница Случайная лекция Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика Мы поможем в написании ваших работ! |
Сегментация и адресация
Процессор может обращаться к одному или более байтам памяти. Под словом в процессоре понимается двухбайтовая ячейка памяти. Для уяснения вопроса о размещении данных в ОЗУ, рассмотрим десятичное число 1315, шестнадцатеричный эквивалент которого равен 0529Н. Это значение может быть помещено в слово в ОЗУ. Оно состоит из старшего байта, значение которого равно 05, и младшего байта со значением 29 (привыкайте, что значения в памяти отображаются в шестнадцатеричном виде). Процессор хранит данные в памяти в инверсном виде: младший байт – по младшему адресу, а старший – по старшему, на 1 больше предыдущего. Поскольку дамп памяти (отображение содержимого ячеек памяти) представляется отладчиками ( TD, DEBUG) в порядке увеличения адресов байтов, интерпретировать значения слов или двойных слов надо справа налево. Например, значение 0529Н в памяти компьютера, начиная с адреса 04А26Н, будет храниться следующим образом: значение 29Н в байте с адресом 04А26Н, а 05 – 04А27Н. Нижеприведенный рисунок иллюстрирует размещение слова в памяти и в регистре. При программировании на ассемблере надо ясно представлять себе разницу между адресом ячейки памяти и ее значением.В рассматриваемом нами примере ячейка, имеющая адрес 04А26, хранит значение 29, а ячейка с адресом 04А27 – 05. В описаниях работы и в алгоритмах обработки информации часто адрес называется указателем переменной, а содержимое указателя – значением переменной. Младший байт Старший байт
Адрес 04А26Н Адрес 04А27Н
Рисунок 4.2. Расположение байтов слова в памяти
Сегменты – это специальные области, определяемые в программе для хранения разных функциональных частей программы: кода программы (алгоритма обработки данных), переменных программы (значений данных), рабочих ячеек для временного хранения промежуточных значений (в программах такая структура называется стеком). Максимальный размер сегмента в реальном режиме может достигать 64К байт, но в каждой программе сегмент занимает столько места в ОЗУ, сколько требуется для размещения команд программы или обрабатываемых программой данных. Начало каждого сегмента (адрес, в который заносится первая команда или первая описываемая переменная) фиксируется (записывается) в сегментном регистре. В реальном режиме используются 3 основные сегмента и соответствующих сегментных регистра: кодовый – CS, данных – DS, стека – SS. Сегментный регистрCS содержит адрес инструкции, к которой обращается ОС для начала выполнения программы. Сегментный регистр DS адресует область переменных и ячеек, зарезервированных для результатов обработки данных. Сегментный регистр SSсодержит адрес специальной структуры для временного сохранения данных или данных, используемых программой в собственных “вызываемых” подпрограммах. Сегмент начинается с границы параграфа, т.е. с адреса, кратного 16 (10Н). Поскольку для всех адресов, делящихся нацело на 16, младший шестнадцатеричный разряд равен 0, разработчики компьютера решили не хранить этот разряд в сегментном регистре, уменьшив за счет этого размер регистра на 4 бита. Поэтому адрес сегмента 038Е0Н будет хранится в сегментном регистре как 038ЕН. При необходимости ссылки на физический (фактический) адрес начала сегмента, такой адрес будем записывать в виде 038Е[0]Н. В программе все ячейки памяти в сегменте нумеруются относительно адреса в соответствующем сегментном регистре. Количество байт от начала сегмента до любого адресуемого в сегменте байта называется смещением (offset). В реальном режиме работы смещение в сегменте размером 64К байт должно изменяться от 0000Н до FFFFH, т.е. для указания смещения в сегменте достаточно 16 двоичных разрядов. Т.о., имея 2 16-битовых регистра для адреса начала сегмента и смещения внутри сегмента, можно адресовать память в 1М байт (не имея сегментации потребовалось бы для адресации ячеек такой памяти 20 двоичных разрядов!). Чтобы обратиться к любой ячейке памяти в сегменте, процессор определяет физический адрес ячейки, складывая значения в сегментном регистре со смещением, при этом не забывая восстановить “отрезанный” шестнадцатеричный нуль младшего разряда сегментного регистра. Например, если в сегменте с начальным адресом 038Е[0]Н команда программы имеет смещение 0032Н, то физический адрес такой команды в ОЗУ будет 038Е[0]Н+0032Н=03912Н. Эту операцию определения физического адреса в ОЗУ процессор выполняет автоматически. Итак, в компьютере существуют 2 основные схемы адресации: 1) абсолютный или физический адрес, представляющий собой 20-разрядное число, прямо указывающее на определенную ячейку ОЗУ; 2) адрес в системе сегмент: смещение, состоящий из начального адреса сегмента и значения смещения. Каждая составляющая сегмент:смещение представляет собой 16-разрядное число. (Аналогом абсолютной адресации была бы последовательная нумерация всех зданий в городе, а аналогом системы сегмент:смещение является определение адреса по улице и номеру дома на этой улице). Программисты редко имеют дело с абсолютной адресацией и даже редко обращают внимание на начало сегмента (ОС сама в большинстве случаев записывает в сегментный регистр соответствующие адреса), а вот смещение внутри сегмента часто приходится учитывать в программах обработки.
Дата добавления: 2014-02-26; просмотров: 636; Нарушение авторских прав Мы поможем в написании ваших работ! |