Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Память, видеосист.DOC
Скачиваний:
6
Добавлен:
16.11.2019
Размер:
1.23 Mб
Скачать

Адресация far

Дальняя адресация FAR нужна для перехода в следующий сегмент (в другие отдаленные сегменты). В этом случае двух байт недостаточно, т.к. для адресации в пределах 1 МБ надо использовать 5 разрядов шестнадцатеричного числа, или 20-разрядную шину;

220 = 1024*1024 = 1 048 576 (1 МБ).

Иными словами, чтобы адресовать ячейки в границах первого мегабайта, физический адрес должен состоять из 2,5 байтов или из пяти шестнадцатеричных разрядов, или из 20-ти двоичных разрядов (20-ти разрядная шина процессора 8086).

Тогда физические адреса в границах 1 МБ имеют значения от 00000h до FFFFFh (2,5 байта).

Соответствующие указатели на ячейки надо указывать с модификатором far.

Адрес FFFFFh можно сформировать так:

F000:FFFF

(Сегментная часть:смещение)

Физический адрес формируется так: сегментную часть процессор сдвигает на 4 разряда влево (на полбайта). Разряд, который появляется справа, заменяют нулём:

F0000h

+

FFFFh

FFFFFh

- получается дальний физический адрес.

Такой же результат можно получить, если написать:

FF000h

+

0FFFh

FFFFFh

Сегментная часть - FF00h, смещение - 0FFFh.

FAR адресация допускает неоднозначность при формировании адресов, т.е. существует много наборов пар сегмент:смещение, соответсвующих одному физическому адресу.

Кроме того, например, сформировали адрес: C000:FFFF и наращиваем указатель на 1:

С000:FFFF

+

1

C000:0000,

т.е. потеряли наращивание указателя - нет перехода между сегментами.

Адресация huge.

Указатели HUGE являются нормализованными и, например, имеют вид:

C000:000F (смещение не превышает F)

+

1

C001:0000

15.10Можно отнимать указатели huge один от другого, сравнивать их, чего не сделаешь с far. (Также можно отнимать и сравнивать указатели near).

У HUGE и соответствующей модели памяти можно организовать непрерывные массивы данных больше 64К, т.е. на 250К, на 500К. Однако для FAR-указателей все операции выполняются быстрее и программы занимают меньше памяти.

Обращение к отдельным ячейкам оп.

Адрес ячейки

4F98

4F99

4F9A

4F9B

Содержимое

A’

255

34h

12h

Число типа int (число 1234h) начинается с чётной ячейки 4F9A; младший разряд (34h) находится в ячейке с меньшим номером, старший – с бóльшим.

Чтобы в ячейке находился код буквы ‘A’, можно записать: char cCh=’A’; при этом компилятор помещает значение переменной cCh, например, в ячейку 4F98. Обратиться к значению этой переменной можно двумя способами:

  • непосредственным вызовом значения cCh;

  • объявлением указателя на переменную типа char:

charPtr;

с последующим присвоением этому указателю значения адреса переменной:

сPtr=&cCh;

После этого значение указателя равно адресу (номеру) ячейки, в которой хранится код буквы А:

сPtr==4F98h.

К данным теперь можно обратиться при помощи операции раскрытия адреса:

*сРtr==’A’;

Указатели – это особые переменные типа адреса с их особенностями и ограничениями. Адреса – константы, указатели – переменные.

Указателям можно присваивать значения разных констант-адресов. Для присвоения указателю адреса ячейки, в которой содержатся какие-либо данные, необходимо использовать операцию взятия адреса &.

Например, после того как было объявлено и инициализировано число int:

int nValue=0x1234; //шестнадцатеричное число,

и компилятор записал это число в ячейки с адресами: 4F9A и 4F9B, к этому числу можно обратиться при помощи указателя, если его объявить следующим образом: