Важной особенностью микропроцессора является способ формирования физического адреса при обращении к памяти. Долгое время регистры микропроцессора Intel (в младших его моделях) были 16-разрядными, а шина адреса имела ширину 20 бит. Для формирования 20-разрядного физического адреса памяти использовались два компонента: сегмент адреса и смещение адреса (segment:offset, где segment и offset – целые числа без знака). Физический адрес образовывался так:
· значение сегмента адреса сдвигается на 4 бита влево с заполнением разрядов справа нулями;
· к образовавшемуся 20-битовому значению прибавляется значение смещения адреса.
Например, адрес 40:1Сh соответствует физическому адресу 0041Сh (00400h+001Ch). Причем один и тот же физический адрес может быть получен из самых разных комбинаций сегмента и смещения адреса. Например, физическому адресу 0041С будут соответствовать следующие пары: 0000:041Сh; 0041:000Ch; 0020:021Ch и др.
При формировании физического адреса в качестве сегментной части адреса микропроцессор использует значения, записанные в сегментных регистрах. Значение в регистре CS, как правило, используется при формировании физического адреса очередной выполняемой инструкции (CS:IP задает адрес следующей команды). Значение в регистре DS задает сегмент физического адреса данных, участвующих в операции. Значение смещения адреса задает либо инструкция (при прямой адресации), либо смещение формируется из значений, записанных в других регистрах процессора. Значение в регистре SS задает сегментную часть адреса для данных в стеке. При этом в качестве смещения принимается значение либо регистра SP, либо BP.
Загрузочный модуль программы в оперативной памяти образуется машинным кодом исполняемой программы, ее данными и стеком. Ту часть загрузочного модуля, которая содержит машинные команды и адресуется с использованием неизменяемого значения регистра СS, называют кодовым сегментом. Для повышения производительности программы компоновщики обычно сводят машинный код всех модулей программы в непрерывную область, называемую кодовой секцией загрузочного модуля (размер ее может быть любым: включать один или несколько отдельных кодовых сегментов, размер отдельного кодового сегмента в секции не превышает 64 К). После загрузки программы в оперативную память регистры CS и IP устанавливаются на первую исполняемую инструкцию кодовой секции – точку входа загрузочного модуля.
Часть загрузочного модуля, которая адресуется с использованием неизменяемого значения регистра DS, называется сегментом данных. Как правило, все сегменты данных в загрузочном модуле располагаются подряд, образуя секцию, или группу сегментов данных программы. Область памяти, выделенная под стек и адресуемая с помощью регистра SS, называется сегментом стека.
Операция & позволяет получить адрес переменной.
//вывод на экран адресов переменных
#include <iostream.h>
int main()
{int var1 = 11;
int var2 = 22;
int var3 = 33;
cout << &var1 << endl //вывод адресов
<< &var2 << endl
<< &var3 << endl;
return 0;
}
Обратите внимание на особенности получения адреса константы:
#include <iostream.h>
#define PI 3.141592
int main()
{
//cout << &PI<< endl; ошибка !!!, адрес константы получить нельзя
return 0;
}
#include <iostream.h>
int main()
{ const int n=5;
cout << &n<< endl; //OK !!! выводитадрес типизированнойконстанты n
return 0;
}
В С++, помимо доступа к переменной по ее имени, существует возможность использования механизма указателей.
Указатель-переменная (указатель) – это переменная, предназначенная для хранения адреса. Значением указателя является адрес данного. Указатель не является самостоятельным типом, он всегда связан с каким-либо другим конкретным типом и занимает 4 байта памяти.
Для доступа к переменным через указатели в С++ определена операция *(операция разыменования, т.е. обращения к содержимому памяти по адресу, хранимому в указателе).
Определение переменной-указателя:
intivar=5; // определение и инициализация переменной типа int
doubledvar=2.0; // определение и инициализация переменной типа double
charcvar=‘a’; // определение и инициализация переменной типа char
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.