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

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


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)
Demon's Souls |#9| Heart of surprises

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


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

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

Предыдущая страница Следующая страница
1 ... 4 5 6 7 8 9 10  11 12 13 14 15 16 17 ... 92
какие  резидентные  программы будут находиться в младших  адресах
памяти. По этой причине во время компоновки программы можно толь-
ко установить некоторые сегментные значения через смещения  отно-
сительно начала программы.  Затем, когда DOS осуществляет привяз-
ку, значение начального адреса программы  прибавляется к сегмент-
ным  значениям, давая абсолютные адреса,  требуемые в  сегментном
регистре. Hа рис. 1-6 показан процесс привязки.
   Файлы  COM  не нуждаются в привязке, поскольку они хранятся  в
таком виде, что не нуждаются в фиксации сегмента. Все в программе
хранится относительно начала кодового сегмента, включая все  дан-
ные и стек. По  этой  причине  вся  программа  не может превышать
65535  байт  по длине, что соответствует максимальному  смещению,
которое существует  в  используемой  схеме  адресации  (поскольку
верхняя часть этого блока занята стеком, то реальное пространство
доступное для кода и данных  немного  меньше чем 65535 байт, хотя
стековый  сегмент при необходимости может быть вынесен за границу
64K байтного блока).  В файлах COM все сегментные регистры указы-
вают на начало PSP; сравните с файлами EXE, где DS и ES инициали-
зируются  аналогичным  образом,  но  CS  указывает на первый байт
следующий за PSP.
   Для  представления программы в виде файла COM требуется соблю-
дение следующих правил:

   1.  Hе оформляйте программу в  виде  процедуры.  Вместо этого,
поместите в самое начало метку, вроде START, и завершите програм-
му оператором END START.
   2. Поместите в начале программы оператор ORG 100H. Этот опера-
тор указывает начало кода (т.е.  устанавливает счетчик  комманд).
Программы COM  начинаются  с  100H,  что  является первым байтом,
следующим  за PSP, поскольку CS указывает на начало PSP,  которое
расположено на 100H байт ниже. Для того чтобы начать выполнение с
любого другого места поместите по адресу 100H инструкцию JMP.
   3.   Оператор  ASSUME должен устанавливать DS, ES и  SS  таким
образом, чтобы они совпадали со значением  для кодового сегмента,
например, ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG.
   4.  Данные программы могут помещаться в любом месте программы,
до тех пор, пока они не перемешаны с кодом.  Лучше начинать прог-
раммы  с области данных, поскольку макроассемблер может  выдавать
сообщения об ошибках при первом  проходе,  если имеются ссылки на
идентификатор  данных, который еще не обнаружен.  Для перехода  к
началу кода используйте в качестве первой команды программы инст-
рукцию JMP.
   5.   Hельзя  использовать фиксацию сегментов типа  MOV  AX,SEG
NEW_DATA. Достаточно указания одного смещения метки. В частности,
нужно  опускать обычный код, используемый в начале программы  для
установки сегмента данных, MOV AX,DSEG / MOV DS,AX.
   6. Стековый сегмент  полностью  опускается  в  начальном коде.
Указатель стека инициализируется на вершину адресного пространст-
ва 64K,  используемого  программой  (напоминаем,  что стек растет
вниз в памяти). В программах COM он должен быть сделан меньше чем
64K, SS и SP могут быть изменены. Имейте ввиду, что при компонов-
ке программы компоновщик выдаст сообщение об ошибке, указывающее,
что сегмент стека отсутствует. Игнорируйте его.
   7. Завершите программу либо  инструкцией RET, либо прерыванием
20H.   Прерывание  20H - это стандартная функция  для  завершения
программы и возврата управления  в  DOS. Даже когда программа за-
вершается  инструкцией RET, на самом деле используется прерывание
20H.  Это происходит потому, что  вершина стека первоначально со-
держит 0.  При выполнении завершающей инструкции программы RET, 0
выталкивается из  стека,  переназначая  счетчик  команд на начало
PSP.  Hаходящаяся в этой ячейке функция 20H, выполняется как сле-
дующая инструкция программы,  вызывая  передачу управления в DOS.
Все это означает, что Вам не  надо  при старте программы помещать
на стек DS и 0 (PUSH DS / MOV AX,0 / PUSH AX), как это  требуется
для EXE файлов.

   После того как  программа  сконструирована  таким образом, ас-
семблируйте и компонуйте ее как обычно.  Затем преобразуйте ее  в
форму COM c помощью утилиты EXE2BIN, имеющейся в MS DOS. Если имя
программы, построенной компоновщиком MYPROG.EXE, то просто введи-
те команду EXE2BIN MYPROG. В  результате  Вы получите программный
файл с именем MYPROG.BIN.  Все что Вам останется после этого сде-
лать - переименовать этот  файл  в  MYPROG.COM.   Вы можете также
сразу использовать команду EXE2BIN MYPROG MYPROG.COM, для получе-
ния файла с расширением COM.

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

   В данном примере содержится полная короткая программа, которая
по  установке переключателей определяет количество накопителей  в
машине и затем  выводит  сообщение  на  экран.  Она может служить
примером  короткой  утилиты  того сорта, для которых  формат  COM
идеален.
CSEG          SEGMENT
              ORG 100H
              ASSUME CS:CSEG, DS:CSEG, SS:CSEG
;---данные
START:        JMP  SHORT BEGIN  ;переход к коду
MESSAGE1      DB   'The dip switches are set for $'
MESSAGE2      DB   'disk drive(s).$'
;---печать первой части сообщения
BEGIN:        MOV  AH,9    ;функция 9 прерывания 21H - вывод
              MOV  DX,OFFSET MESSAGE1  ;строки
              INT  21H     ;выводим строку
              PUSH AX      ;сохраняем номер функции на будущее
;---получаем установку переключателей из порта A микросхемы 8255
              IN   AL,61H  ;получаем байт из порта B
              OR   AL,10000000B  ;устанавливаем бит 7
              OUT  61H,AL        ;заменяем байт
              IN   AL,60H        ;получаем установку переключат.
              AND  AL,11000000B  ;выделяем старшие 2 бита
              MOV  CL,6          ;подготовка к сдвигу AL вправо
              SHR  AL,CL         ;сдвигаем 2 бита в начало
              ADD  AL,49         ;добавляем 1, чтобы считать с 1
                                 ;и 48 для перевода в ASCII
              MOV  DL,AL         ;помещаем результат в DL
              MOV  AL,61H        ;должны восстановить порт B
              AND  AL,01111111B  ;сбрасываем бит 7
              OUT  61H,AL        ;возвращаем байт
;---печать числа накопителей
              MOV  AH,2          ;функция 2 прерывания 21H
              INT  21H           ;печатаем число из DL
;---печать второй половины сообщения
              POP  AX            ;берем номер функции со стека
              MOV  DX,OFFSET MESSAGE2
              INT  21H           ;выводим строку
              INT  20H           ;завершение программы
CSEG          ENDS
              END START




                      Глава 2. Таймеры и звук.

   Раздел 1. Установка и чтение таймера.

   Все  IBM PC используют микросхему таймера 8253 (или 8254)  для
согласования импульсов от микросхемы системных часов.  Число цик-
лов  системных часов преобразуется в один  импульс, а  последова-
тельность этих импульсов  подсчитывается для определения времени,
или  они  могут быть посланы на громкоговоритель  компьютера  для
генерации звука определенной частоты.   Микросхема 8253 имеет три
идентичных независимых канала, каждый из которых может программи-
роваться.
   Микросхема 8253 работает  независимо  от процессора. Процессор
программирует микросхему и затем обращается к другим делам. Таким
образом 8253 действует как часы  реального  времени - она считает
свои  импульсы независимо от того, что  происходит в  компьютере.
Однако, максимальный  программируемый интервал составляет прибли-
зительно 1/12 секунды.  Для подсчета интервалов времени в часы  и
минуты нужны какие-то другие  средства.   Именно  по этой причине
импульсы  от нулевого канала микросхемы таймера  накапливаются  в
переменной, находящейся в области данных BIOS. Этот процесс пока-
зан на рис.  2-1. Это накопление обычно называется подсчетом вре-
мени суток.  18.2 раза  в  секунду  выход канала 0 обрабатывается
аппаратным  прерыванием (прерыванием таймера), которое  ненадолго
останавливает  процессор  и  увеличивает  счетчик  времени суток.
Число  0  соответствует  полночи 12:00; когда  счетчик  достигает
значения эквивалентного 24 часам, он сбрасывается на ноль. Другое
время  в  течение суток легко  определяется  делением  показателя
счетчика на 18.2 для каждой  секунды.   Счетчик времени суток ис-
пользуется в большинстве операций, связанных со временем.
   2.1.1 Программирование микросхемы таймера 8253/8254.

   Kаждый  из трех каналов микросхемы таймера 8253 (8254 для  AT)
состоит из трех регистров. Доступ к каждой группе из трех регист-
ров  осуществляется через один порт; номера портов от 40H до  42H
соответствуют каналам 0 -  2.  Порт  связан  с 8-битным регистром
ввода/вывода, который посылает и принимает данные для этого кана-
ла.  Kогда канал  запрограммирован, то через этот порт посылается
двухбайтное значение, младший байт сначала.  Это число передается
в 16-битный регистр задвижки (latch register), который хранит это
число и из которого копия помещается в 16-битный регистр  счетчи-
ка. В регистре счетчика число  уменьшается на единицу каждый раз,
когда импульс от системных часов пропускается через канал.  Kогда
значение этого числа  достигает  нуля,  то  канал выдает выходной
сигнал и затем новая копия содержимого регистра задвижки передви-
гается в регистр счетчика,  после  чего процесс повторяется.  Чем
меньше число в регистре счетчика, тем быстрее ритм. Все три кана-
ла всегда активны: процессор не включает и не выключает их. Теку-
щее  значение любого из регистров счетчика может быть прочитано в
любой момент времени, не влияя на счет.
   Kаждый канал имеет две входные и одну выходную линии. Выходная
линия выводит импульсы, возникающие в результате подсчета. Hазна-
чение этих сигналов варьируется в зависимости от типа IBM PC:

   Kанал 0 используется системными часами времени суток. Он уста-
навливается BIOS при  старте  таким  образом, что выдает импульсы
приблизительно  18.2 раза в секунду.  4-байтный счетчик этих  им-
пульсов хранится в памяти по адресу  0040:006C (младший байт хра-
нится первым).  Kаждый импульс инициирует прерывание таймера (но-
мер 8) и именно это  прерывание  увеличивает  показание счетчика.
Это  аппаратное  прерывание, поэтому оно  обрабатывается  всегда,
независимо от того, чем  занят  процессор,  если только разрешены
аппаратные прерывания (см. обсуждение в [1.2.2]).  Выходная линия
используется также для синхронизации некоторых дисковых операций,
поэтому если Вы изменили ее значение, то Вам необходимо восстано-
вить первоначальное значение перед обращением к диску.

   Kанал  1  управляет обновлением памяти на всех  машинах  кроме
PCjr, поэтому его лучше не  трогать.  Выходная линия этого канала
связана  с микросхемой прямого доступа к памяти [5.4.2] и ее  им-
пульс заставляет  микросхему  DMA  обновить  всю память.  Hа PCjr
канал  1 служит для преобразования входных данных с клавиатуры из
последовательной в параллельную форму. PCjr не использует микрос-
хему  прямого  доступа к памяти, поэтому когда  он  вместо  этого
прогоняет данные через процессор, то прерывание от таймера забло-
кировано.  Kанал 1 используется для подсчета заблокированных  им-
пульсов часов времени  суток,  с  тем  чтобы  можно было обновить
значение счетчика после завершения дисковых операций.

   Kанал  2 связан с громкоговорителем компьютера и он производит
простые прямоугольные импульсы для  генерации звука. Программисты
имеют  больший контроль над вторым каналом, чем  над  остальными.
Простые звуки могут  генерироваться  одновременно с другими прог-
раммными операциями, а более сложные звуковые эффекты могут  быть
достигнуты за счет использования  процессора.  Kанал 2 может быть
отсоединен  от громкоговорителя и использоваться для  синхрониза-
ции. Hаконец, выходная линия канала 2 связана с динамиком компью-
тера.   Однако динамик не будет генерировать звук до тех пор пока
не сделаны определенные установки микросхемы интерфейса с перифе-
Предыдущая страница Следующая страница
1 ... 4 5 6 7 8 9 10  11 12 13 14 15 16 17 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама