Указатели. Ссылки. Операции над указателями. Загрузочный модуль программы в оперативной памяти

Страницы работы

Фрагмент текста работы

Указатели. Ссылки. Операции над указателями

Важной особенностью микропроцессора является способ формирования физического адреса при обращении к памяти. Долгое время регистры микропроцессора 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

Похожие материалы

Информация о работе

Тип:
Конспекты лекций
Размер файла:
337 Kb
Скачали:
0