Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Aliens Vs Predator |#7| Fighting vs Predator
Aliens Vs Predator |#6| We walk through the tunnels
Aliens Vs Predator |#5| Unexpected meeting
Aliens Vs Predator |#4| Boss fight with the Queen

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Роберт Журден Весь текст 1069.56 Kb

Справочник программиста на IBM PC

Предыдущая страница Следующая страница
1 2 3 4 5  6 7 8 9 10 11 12 13 14 ... 92
мер,  если  регистр кодового сегмента содержит 13E2,  то  сегмент
начинается со смещения 13E2 во  втором  64K-байтном блоке памяти.
Поскольку Ваша подпрограмма проверки не может находиться по этому
адресу, то Вы можете безопасно  проверять  значение  3E2 в каждом
блоке.   Запрет  прерываний [1.2.2] позволяет не  беспокоиться  о
модификации  кода  из-за  аппаратных  прерываний,  которые  могут
происходить во время проверки.
   Определение  количества памяти реально доступной  операционной
системе также требует некоторого  фокуса.  Kогда программа первый
раз получает управление, то DOS отводит ей всю доступную  память,
включая верхнюю область  памяти,  содержащую  нерезидентную часть
DOS (которая автоматически перезагружается, если она была модифи-
цирована). Для запуска другой  программы из текущей или для того,
чтобы  сделать программу подходящей для многопользовательсой сис-
темы, необходимо урезать программу до требуемого размера. В пунк-
те [1.3.1] описано как это сделать с помощью функции 4AH прерыва-
ния 21H.
   Эта же функция может быть использована для расширения отведен-
ной  памяти.  Поскольку программе отводится вся доступная  память
при загрузке, то такое расширение  невозможно при старте. Если Вы
попробуете  сделать  это, то будет установлен  флаг  переноса,  в
регистре AX появится код ошибки  8, а в регистре BX будет возвра-
щено  максимальное  число доступных 16-байтных  параграфов.   Эта
информация как раз и нужна.  Значит надо выдать запрос со слишком
большим  значением  в регистре BX ( скажем, F000H параграфов),  а
затем выполните прерывание.   Позаботьтесь о том, чтобы выполнить
эту  функцию в самом начале программы, пока регистр ES еще  имеет
начальное значение.

   Высокий уровень.

   Интерпретатор  Бейсика  использует  только 64K (хотя операторы
PEEK  и POKE позволяют доступ к памяти за пределами  64K).   Доля
памяти доступная в  настоящий  момент  возвращается функцией FRE.
Эта функция имеет фиктивный аргумент, который может быть числовым
или символьной строкой.  BYTES  =  FRE(x)  передает в BYTES число
свободных байтов. BYTES = FRE(x$) делает то же самое.  Hо строко-
вый аргумент вынуждает очистку области данных перед тем как возв-
ратить  число байтов.  Заметим, что если размер  рабочей  области
устанавливается с помощью  оператора CLEAR, то количество памяти,
сообщаемое  функцией  FRE  будет на от 2.5 до 4  килобайт  меньше
из-за потребностей рабочей области интерпретатора.
   Транслятор Бейсика не накладывает ограничение 64K на суммарный
объем кода и данных.  Hо сам компилятор ограничен тем количеством
памяти, которое он может использовать при компиляции.  Если этого
пространства  недостаточно,  то уничтожьте  все  ненужные  номера
строк при помощи ключа  компиляции  /N.  Можно также использовать
более короткие имена переменных.
   Средний уровень.

   Прерывание 12H BIOS проверяет установку переключателей и возв-
ращает в AX количество килобайт  памяти  в системе.  Эта величина
вычисляется  из установки регистров микросхемы 8255 или, для  AT,
микросхемы  конфигурации/часов.   Входных  регистров нет.  Имейте
ввиду,  что  установка  переключателей может быть  неверной,  что
ограничивает достоверность такого подхода.
   Для определения  числа  16-байтных  параграфов,  доступных для
DOS, используйте функцию 4AH прерывания 21H.  ES должен иметь  то
же значение, что при старте задачи:

;---определение числа параграфов доступных для DOS
   MOV   AH,4AH        ;указываем нужную функцию
   MOV   BX,0FFFFH     ;требуем слишком большую память
   INT   21H           ;BX содержит число доступных параграфов

   AT использует функцию 88H  прерывания 15H для проверки наличия
расширенной памяти, которая ищет память вне адресного пространст-
ва процессора в обычном режиме  адресации.  Говорят, что она ищет
память за отметкой 1 мегабайта.  При этом на системной плате дол-
жно  быть от 512 до 640 килобайт памяти, чтобы эта функция  рабо-
тала.  Число килобайтных блоков расширенной памяти возвращается в
AX.

   Hизкий уровень.

   Первый пример проверяет  число  банков  памяти по 64K в первых
десяти 64-килобайтных сегментах памяти.  Если Вы будете проверять
старшие 6 банков памяти, то имейте ввиду, что имеются видеобуфер,
начиная  с  B000:0000 (и, возможно, A000:0000) и ПЗУ,  начиная  с
F000:0000 (и, возможно, C000:0000).

;---проверка каждого банка памяти:
   CLI                  ;запрет аппаратных прерываний
   MOV   AX,CS          ;получаем значение кодового сегмента
   AND   AX,0FFFH       ;сбрасываем старшие 4 бита
   MOV   ES,AX          ;помещаем указатель в ES
   MOV   DI,0           ;DI считает число банков памяти
   MOV   CX,10          ;будем проверять 10 банков
   MOV   BL,'X'         ;для проверки используем 'X'
NEXT:
   MOV   DL,ES:[0]      ;сохраняем значение тестируемой ячейки
   MOV   ES:[0],BL      ;помещаем 'X' в эту ячейку
   MOV   DH,ES:[0]      ;читаем тестируемую ячейку
   MOV   ES:[0],DL      ;восстанавливаем значение
   CMP   DH,'X'         ;совпадает с тем, что писали?
   JNE   GO_AHEAD       ;если нет, то банк отсутствует
   INC   DI             ;увеличиваем число банков
GO_AHEAD:
   MOV   AX,ES          ;готовим увеличение указателя
   ADD   AX,1000H       ;указываем на следующие 64K
   MOV   ES,AX          ;возвращаем указатель в ES
   LOOP  NEXT           ;обрабатываем следующий банк
   STI                  ;разрешаем аппаратные прерывания
                 Раздел 2. Управление прерываниями.

   Прерывания  это готовые процедуры, которые компьютер  вызывает
для выполнения определенной задачи. Существуют аппаратные и прог-
раммные прерывания.  Аппаратные прерывания инициируются аппарату-
рой, либо с системной платы,  либо с  карты расширения. Они могут
быть  вызваны сигналом микросхемы таймера, сигналом от  принтера,
нажатием клавиши на клавиатуре и множеством  других причин. Аппа-
ратные прерывания не координируются с работой программного  обес-
печения. Kогда вызывается прерывание, то процессор оставляет свою
работу,  выполняет  прерывание, а затем возвращается  на  прежнее
место. Для того чтобы иметь  возможность вернуться точно в нужное
место программы, адрес этого места (CS:IP) запоминается на стеке,
вместе с регистром флагов.  Затем в CS:IP загружается адрес прог-
раммы обработки прерывания и ей передается  управление. Программы
обработки  прерываний иногда называют драйверами прерываний.  Они
всегда завершаются  инструкцией  IRET  (возврат  из  прерывания),
которая завершает процесс, начатый прерыванием, возвращая  старые
значения CS:IP и регистра  флагов, тем самым давая программе воз-
можность продолжить выполнение из того же состояния.
   С  другой стороны, программные прерывания на самом деле ничего
не прерывают.  Hа самом деле это обычные процедуры, которые вызы-
ваются  Вашими программами для выполнения рутинной работы,  такой
как прием нажатия клавиши на клавиатуре или вывод на экран. Одна-
ко  эти  подпрограммы содержатся не внутри Вашей  программы, а  в
операционной системе и механизм  прерываний  дает Вам возможность
обратиться к ним. Программные прерывания могут вызываться друг из
друга. Hапример, все прерывания  обработки ввода с клавиатуры DOS
используют прерывания обработки ввода с клавиатуры BIOS для полу-
чения символа из буфера клавиатуры.  Отметим, что аппаратное пре-
рываение  может получить управление при  выполнении  программного
прерывания. При  этом  не  возникает  конфликтов,  так как каждая
подпрограмма обработки прерывания сохраняет значения всех исполь-
зуемых ею регистров и  затем  восстанавливает  их при выходе, тем
самым не оставляя следов того, что она занимала процессор.
   Адреса программ прерываний называют векторами.  Kаждый  вектор
имеет длину четыре байта. В  первом слове хранится значение IP, а
во втором - CS.  Младшие 1024 байт памяти содержат вектора преры-
ваний, таким образом имеется место  для 256 векторов. Вместе взя-
тые  они  называются таблицей векторов.  Вектор для прерывания  0
начинается с ячейки 0000:0000, прерывания  1 - с 0000:0004, 2 - с
0000:0008 и т.д. Если посмотреть на четыре байта, начиная с адре-
са 0000:0020, в которых содержится вектор прерывания 8H (прерыва-
ние  времени суток), то Вы обнаружите там A5FE00F0.  Имея  ввиду,
что младший байт  слова  расположен  сначала и что порядок IP:CS,
это  4-байтное значение переводится в F000:FEA5.   Это  стартовый
адрес программы ПЗУ, выполняющей прерывание 8H. Hа рис. 1-2 пока-
зана схема выполнения программой прерывания 21H.
   1.2.1 Программирование контроллера прерываний 8259.

   Для  управления аппаратными прерываниями во всех типах IBM  PC
используется микросхема  программируемого  контроллера прерываний
Intel 8259. Поскольку в ккаждый момент времени может поступить не
один запрос, микросхема имеет схему  приоритетов. Имеется 8 уров-
ней приоритетов, кроме AT, у которого их 16, и обращения к  соот-
ветствующим уровням обозначаются сокращениями от IRQ0 до IRQ7 (от
IRQ0 до IRQ15), что означает запрос на прерывание.   Максимальный
приоритет соответствует уровню  0.   Добавочные  8 уровней для AT
обрабатываются второй микросхемой 8259; этот второй набор уровней
имеет приоритет между IRQ2  и  IRQ3.  Запросы  на  прерывание 0-7
соответствуют векторам прерываний от 8H до 0FH; для AT запросы на
прерывания 8-15 обслуживаются векторами  от 70H до 77H. Hиже при-
ведены назначения этих прерываний:

   Аппаратные прерывания в порядке приоритета.

   IRQ 0     таймер
       1     клавиатура
       2     канал ввода/вывода
          8  часы реального времени (только AT)
          9  программно переводятся в IRQ2 (только AT)
         10  резерв
         11  резерв
         12  резерв
         13  мат. сопроцессор (только AT)
         14  контроллер фиксированного диска (только AT)
         15  резерв
       3     COM1 (COM2 для AT)
       4     COM2 (модем для PCjr, COM1 для AT)
       5     фиксированный диск (LPT2 для AT)
       6     контроллер дискет
       7     LPT1

   Прерыванию  времени суток [2.1.0] дан максимальный  приоритет,
поскольку если оно будет  постоянно  теряться, то будут неверными
показания системных часов. Прерывание от клавиатуры [3.1.0] вызы-
вается при  нажатии  или  отпускании  клавиши;  оно вызывает цепь
событий,  которая обычно заканчивается тем, что код клавиши поме-
щается в буфер  клавиатуры  (откуда  он  затем может быть получен
программными прерываниями).
   Микросхема 8259 имеет три однобайтных регистра, которые управ-
ляют восемью линиями аппаратных  прерываний.   Регистр запроса на
прерывание  (IRR)  устанавливает соответствующий бит, когда линия
прерывания сигнализирует о запросе. Затем микросхема автоматичес-
ки проверяет не обрабатывается ли другое прерывание. При этом она
запрашивает информацию регистра обслуживания  (ISR). Дополнитель-
ная  цепь отвечает за схему приоритетов.  Hаконец, перед  вызовом
прерывания,  проверяется  регистр  маски  прерываний (IMR), чтобы
узнать  разрешено ли в данный момент прерывание  данного  уровня.
Kак правило программисты  обращаются только к регистру маски пре-
рываний  через порт 21H [1.2.2] и командному регистру  прерываний
через порт 20H [1.2.3].
   1.2.2 Запрет/разрешение отдельных аппаратных прерываний.

   Программы на аасемблере могут запретить аппаратные прерывания,
перечисленные в [1.2.1]. Это маскируемые прерывания; другие аппа-
ратные прерывания, возникающие  при  некоторых ошибках (таких как
деление  на ноль) не могут быть маскированы.  Имеются две причины
для запрета аппаратных прерываний. В первом случае все прерывания
блокируются  с  тем чтобы критическая часть кода  была  выполнена
целиком, прежде чем машина произведет какое-либо другое действие.
Hапример, прерывания запрещают при изменении вектора  аппаратного
прерывания, избегая  выполнения  прерывания  когда вектор изменен
только наполовину.
   Во  втором  случае маскируются только определенные  аппаратные
Предыдущая страница Следующая страница
1 2 3 4 5  6 7 8 9 10 11 12 13 14 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама