10 DEFSEG=$H2222 'установить значение сегмента равным
шестнадцатиричных 2222
20 Х=PEEK(&H3333)' выбрать значение, смещенное на 3333
шестнадцатиричных
30 REM чисто для примера проверяем в каком регистре за дан код буквы
и если она в нижнем регистре, то переводим ее в верхний регистр
40 IF(CHR$(X)>="a")AND(CHR$(X)<="z")THEN POKE&H3333,(X-32)
Таким образом, в программе на Бейсике доступ к любой ячейке памяти
осуществляется с помощью комбинации операторов DEF SEG и PEEK или POKE.
Работа с ними встречается в листингах программ 1.1, 3.1 и 8.1,
использующих такую возможность Бейсика для различных целей.
Паскаль разрешает аналогичный способ программного использования
сегментированной адресации, правда в более унифицированном и гибком виде
чем Бейсик. На Паскале можно определить переменную как сегментированный
адрес, например:
VAR пример_адреса : adasmem,
а затем непосредственно задать его сегментную и относительную части ('.s'
и '.r', соответственно):
пример_адреса.s : = # 2222;
пример_адреса.r : = # 3333;
Когда все эти присваивания выполнены, можно осуществлять доступ к
памяти с помощью указателя сегментированного адреса:
x : = пример_адреса^;
if(chr(x)> = "a") and (chr(x)< = "z") then
пример_адреса^ : = x - 32;
3.3. Организация памяти IBM/PC
Имея адресное пространство свыше миллиона байт IBM/PC позволяет более
удобно и более гибко использовать память, чем большинство других, меньших
персональных компьютеров. Весь объем памяти распределен довольно
интересным образом. С одной стороны, резервирование определенных ячеек
памяти может наложить ограничение на возможные применения компьютера. В
IBM/PC резервируется несколько областей в верхних адресах памяти. Эти
область имеют особое назначение, а все нижние адреса оставлены для
свободного использования. Таким образом сочетаются достоинства
использования зарезервированных блоков памяти и сохранения как можно
большего объема памяти для свободного использования.
На рис. 3.3. показана простая схема распределения памяти. Верхняя
четверть общего объема памяти, начиная с ячейки C 000 и до конца,
практически всегда занимается постоянным запоминающим устройством или ПЗУ.
(В дальнейшем все упоминающиеся адреса будут без специального напоминания
даваться в шестнадцатиричном виде.) Фактически ПЗУ занимает только верхние
8К, начиная с адреса FE00, в которых находится система BIOS (подробно
описанная в главе 6). Система BIOS в ПЗУ включает все основные служебные
процедуры IBM/PC, в том числе тестовые программы, которые запускаются при
включении компьютера.
Следующие (если идти сверху вниз) 32К используются для хранения
интерпретатора Бейсика. Бейсик-ПЗУ начинается с ячейки F600 и
заканчивается непосредственно перед BIOS. В главе 6 описывается
интерпретатор Бейсика в ПЗУ. В принципе, любая часть адресного
пространства может быть занята постоянной памятью, но в соответствии с
общими правилами организации памяти IBM/PC, адреса ПЗУ должны быть больше
C000. Как упоминалось в главе 2, в системном блоке IBM/PC установлено пять
микросхем ПЗУ и одно свободное гнездо для установки микросхемы. Эти пять
микросхем содержат BIOS и Бейсик. Каждая микросхема имеет емкость 8К. Еще
8К можно добавить с помощью свободного гнезда и начальный адрес для них
будет равен F400, так чтобы они располагались непосредственно перед
Бейсиком.
***
Рис. 3.3. Распределение памяти:
1-шестнадцатиричный адрес; 2-память, размещенная в системном блоке;
3-память,размещаемая в блоке расширения; 4-предел обычной памяти в 256К;
5-свободная часть; 6-зарезервирована для дисплеев; 7-монохромный дисплей;
8-свободна для использования дисплеями; 9-цветной графический дисплей;
10-область дисплейной памяти; 11-область возможного добавления ПЗУ;
12-Бэйсик-ПЗУ; 13-BIOS-ПЗУ; 14-нижние адреса; 15-верхние адреса
Ниже области ПЗУ располагается большой сегмент памяти,
предназначенный для поддержки экранного режима дисплеев. Для хранения
информации, отображаемой на экране, необходимо использовать специальную
область памяти, которая может располагаться как внутри дисплея, так и
внутри компьютера, с которым он соединен. В IBM/PC экранная память входит
в общее адресное пространство компьютера (хотя конструктивно она
размещается на плате расширения для дисплея). В главе 8 мы более подробно
рассмотрим размещение и использование экранной памяти.
Блок экранной памяти начинается с адреса B000 и занимает 64К, вплоть
до адреса C000. Этот блок делится на две части. Нижняя половина,
начинающаяся с адреса B000, используется монохромным дисплеем. Верхняя
половина, начинающаяся с адреса B800, используется цветным графическим
дисплеем. В главах 8 и 9 более подробно описывается структура и
использование этой памяти.
Ни один из дисплейных адаптеров не требует и не использует все 32К,
выделенные для них. Монохромный дисплей использует всего 4К, а цветной
графический дисплей использует 16К. Оставшаяся часть памяти в настоящее
время не используется, но может понадобиться для более совершенных
дисплейных адаптеров.
Фактически, для дисплейных адаптеров выделено больше памяти, чем эти
64Кот B000 до C000. Блок в 64К, предшествующий им, также зарезервирован. В
соответствии с документацией IBM/PC блок, начинающийся с адреса A000,
резервируется двумя способами. Первые 16К, от A000 до A4000,
зарезервированы совершенно таинственным образом, не имеется ни малейшего
указания на то, для чего это сделано. Остальные 48К этого блока от A400 до
B000, входит в область 112К, которая считается зарезервированной для
экранной памяти. Таким образом, вся область экранной памяти располагается
с адреса A400 до C000.
Можно предположить, что эта большая область, особенно 18К в блоке
A000, будут использоваться каким-нибудь новым дисплеем с высокой
разрешающей способностью, которому потребуется больше памяти чем для
обычного монохромного или цветного графического дисплея. Непонятно только
назначение первых 16К блока A000, не обозначенных как часть экранной
памяти.
Объем памяти, расположенной ниже адреса A000, составляет 64К, которые
предназначены для обычного использования памяти компьютера. Первые 64К, до
адреса 1000, располагаются на основной системной плате IBM/PC, а все
остальные микросхемы памяти размещаются в блоках расширения. По сообщениям
фирмы "ИБМ", IBM/PC поддерживает всего 256К памяти, но этот предел связан
только с тестами BIOS, которые при запуске компьютера проверяют такой
объем памяти. Всегда можно подключить больше чем 256К памяти.
Вся обычная оперативная память, подключенная к Вашему компьютеру,
располагается в нижних адресах общего адресного пространства. Вы можете
подключить такой объем памяти какой Вам необходим в пределах,
накладываемых зарезервированными адресами. Независимо от того, подключено
ли к Вашему компьютеру 48К или 576К, они всегда размещаются начиная с
адреса 0000.
Таким образом, оперативная память всегда занимает нижние адреса
пространства, а постоянная память - в верхних адресах. Между ними
располагается экранная память. Между всеми этими разделами могут быть
промежутки - промежуток от конца оперативной памяти до начала экранной
памяти и от конца экранной памяти до начала ПЗУ. Это неиспользуемая часть
памяти IBM/PC.
Оперативная память временно используется работающими программами и их
данными. Часть этой памяти, ее начальные адреса, используются для нужд
самого микропроцессора, а другие небольшие фрагменты используются
операционной системой и интерпретатором Бейсика. Оставшаяся память может
использоваться любыми программами.
Самая нижняя часть памяти, начинающаяся с нулевого адреса и
занимающая примерно 1500 байт, предназначена для хранения необходимой
рабочей информации для компьютера. Первая часть этой области содержит
вектора прерываний, которые более подробно будут рассмотрены в разделе
3.5. После векторов прерываний располагается информация, необходимая для
управляющих процедур BIOS, операционной системы ДОС и интерпретатора
Бейсика, а также их рабочие ячейки. После зарезервированной области в
нижних адресах памяти начинается рабочая область, в которую загружаются
программы и где хранятся их данные.
Можно исследовать память IBM/PC и установить, какие блоки
используются и где они размещены в адресном пространстве. Программы могут
пытаться выполнять чтение и запись по любым адресам памяти. Можно
предположить, что обращение к неподключенной памяти приведет к появлению
сигнала ошибки, но на практике этого не происходит. Причина этого проста -
работа микропроцессора 8088 с памятью заключается в обращении к каналу
ввода/вывода, который описан в главе 2, и ожиданием результата. Даже если
память не подключена, микропроцессор не замечает разницы.
Однако, можно достаточно просто проверить наличие или отсутствие
памяти по определенному адресу. Один из методов заключается в чтении из
различных областей памяти с последующей проверкой результатов.
Непродолжительные эксперименты показывают, что при большинстве методов
чтения, как через DEBUG, так и с помощью средств языка Паскаль,
результатом всегда оказывается байт со всеми единичными битами; что
соответствует шестнадцатиричному значению FF или CHR$(255).
Такой результат никого не должен удивлять - ведь при чтении
несуществующей памяти наиболее вероятно получить либо все нули, либо все
единицы. По какой-то причине, которая мне до сих пор не понятна,
интерпретатор Бейсика всегда возвращает значение CHR$(233). Результаты не
совсем однозначны, но в большинстве случаев Бейсик возвращает именно это
странное значение, CHR$(233), при чтении неподключенной памяти.
Такое свойство можно использовать для проверки того, какая часть
адресного пространства активна. Листинг 3.1. показывает простую программу
на Бейсике, которая считывает по нескольку байт из каждого килобайта
памяти и сравнивает их со значением CHR$(233). Если Вы запустите эту
программу на своем компьютере, то она покажет какой объем памяти к нему
подключен. Рисунок 3.4 показывает результат выполнения этой программы на
IBM/PC, который я использовал при написании этой книги. Посмотрим о чем
они говорят.
Во-первых, отметим, что были обнаружены три блока памяти - то есть,
именно столько, сколько должно быть подключено к IBM/PC. Первый блок
начинается с адреса 0 или самого начала памяти. Это обычная, оперативная
память компьютера. В данном конкретном компьютере первый блок имеет размер
576Кбайт. Сюда входят 64К в системном блоке и еще 512К в блоке расширения.
Второй блок активной памяти начинается с адреса B000. Это память,
используемая адаптером монохромного дисплея. Поэтому можно сделать вывод,
что данный компьютер работает с монохромным дисплеем, а не с цветным
графическим адаптером. Заметим, что наша исследовательская программа
считает, что эта память занимает 32К, в то время как в действительности
монохромный адаптер включает включает всего 4Кбайта. Лишние 28К
обнаруженные программой, можно, вероятно, отнести на счет побочных
эффектов, связанных с работой схем, которые поддерживают реальные 4К