- •Управление оп компьютера.
- •Использование оперативной памяти под ms-dos. Высвобождение стандартной оперативной памяти.
- •Состав файла config.Sys
- •Emm386.Exe ram размер_памяти
- •Файл autoexec.Bat
- •Программирование операций с оп. Использование указателей.
- •Структура сегменту пам’яті
- •Адресация far
- •Адресация huge.
- •15.10Можно отнимать указатели huge один от другого, сравнивать их, чего не сделаешь с far. (Также можно отнимать и сравнивать указатели near).
- •Обращение к отдельным ячейкам оп.
- •Int *nPtr; - отведено место под указатель;
- •Непосредственная инициализация указателей. Обращение к ячейкам оп в пределах 1мб.
- •Программирование видеоадаптеров програмування відеоадаптерів Архітектура відеоадаптера
- •20.10Режимы работы видеоадаптеров
- •Vga (Video Graphic Array) – видеографический массив.
- •Видеоадаптеры svga (SuperVga)
- •Режимы работы видеоадаптеров svga по стандарту vesa
- •Int 10h ; прерывание для работы с видеосистемой.
- •Текстовый режим работы видеоадаптера.
- •Формат байтов символа
- •Мерцающий зеленый символ на красном фоне. Программирование непосредственной записи в видеобуфер.
- •2 4.10Видеоконтроллер в графическом режиме (например, cga № 4).
- •Т ехнология изменения цвета пиксела. П оследовательность действий.
Адресация 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:
char *сPtr;
с последующим присвоением этому указателю значения адреса переменной:
сPtr=&cCh;
После этого значение указателя равно адресу (номеру) ячейки, в которой хранится код буквы А:
сPtr==4F98h.
К данным теперь можно обратиться при помощи операции раскрытия адреса:
*сРtr==’A’;
Указатели – это особые переменные типа адреса с их особенностями и ограничениями. Адреса – константы, указатели – переменные.
Указателям можно присваивать значения разных констант-адресов. Для присвоения указателю адреса ячейки, в которой содержатся какие-либо данные, необходимо использовать операцию взятия адреса &.
Например, после того как было объявлено и инициализировано число int:
int nValue=0x1234; //шестнадцатеричное число,
– и компилятор записал это число в ячейки с адресами: 4F9A и 4F9B, к этому числу можно обратиться при помощи указателя, если его объявить следующим образом: