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

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


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

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


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

Ассемблер и программирование для IBM PC

Предыдущая страница Следующая страница
1 ... 66 67 68 69 70 71 72  73 74 75 76 77 78 79 ... 85
флаговый байт клавиатуры (KBFLAG), который отражает состояние  клавиатуры.
Бит 3 в этом байте регистрирует нажатие клавиши Alt, а  бит  1  -  нажатие
клавиши Left Shift.
     Сегмент  CSEG  начинает  сегмент  обычной    COM-программы.    Первая
выполняемая команда  JMP  INITZE  обходит  резидентную  часть  и  передает
управление в процедуру  инициализации  (INITZE)  в  конце  программы.  Эта
процедура устанавливает в регистре DS адрес  таблицы  векторов  прерывания
(INTTAB) и передает адрес элемента таблицы  для  INT  9  (KBADDR)  в  поле
KBSAVE в  резидентной  процедуре.  Следующим  шагом  в  таблице  в  KBADDR
утанавливается адрес  резидентной  процедуры  (COLORS)  (первое  слово)  и
содержимое регистра CS (второе  слово).  Таким  образом,  KBADDR  содержит
теперь два измененных слова: смещение и значение адреса  из  регистра  CS,
которые вместе определяют адрес процедуры  COLORS  в  памяти,  куда  будут
направляться теперь все символы, поступающие с клавиатуры. Затем процедура
инициализации заносит в регистр DX размер процедуры COLORS  (адрес  INITZE
на один байт больше,  чем  адрес  конца  процедуры  COLORS)  и  прекращает
работу, используя INT 27H.
     Процедура COLORS является резидентной, и она получает управление  при
нажатии любой клавиши на клавиатуре.  Так как это  происходит  при  работе
других программ (например, DOS или  текстового  редактора),  то  процедура
должна сохранить все регистры, которые она использует (а  также  несколько
других на всякий случай).  Затем происходит вызов по адресу  KBSAVE,  т.е.
вызов подпрограммы обработки прерывания, после  чего  процедура  проверяет
флаг клавиатуры для определения нажатия клавиш Alt и Left Shift.  Если эти
клавиши  были  нажаты,  то  процедура  устанавливает  необходимые   цвета.
Завершающие  команды  включают  восстановление  всех  запомненных  вначале
регистров (в обратной последовательности) и выход из обработки  прерывания
по команде IRET.
     Поскольку приведенная программа  носит  иллюстративный  характер,  ее
можно  модифицировать  или  расширить  для  собственных  целей.  Некоторые
фирменные программы,  также  изменяющие  адрес  в  векторной  таблице  для
прерывания  9,  не  разрешают  конкурентное   использование    резидентных
программ, аналогичных рассмотренной в данной главе.


     ПОРТЫ
     ________________________________________________________________

     Порт представляет собой устройство,  которое  соединяет  процессор  с
внешним миром.  Через порт процессор получает сигналы с устройств ввода  и
посылает  сигналы  на  устройство  вывода.  Теоретически  процессор  может
управлять до 65 536 портами, начиная  с  нулевого  порта.  Для  управления
вводом-выводом непосредственно на уровне порта используются команды  IN  и
OUT:
          - Команда IN передает данные из  входного  порта  в  регистр  AL
     (байт) или в регистр АХ (слово). Формат команды:

               IN        регистр,порт

          - Команда OUT передает данные в порт из регистра AL  (байт)  или
     из регистра АХ (слово). Формат команды:

               OUT       порт,регистр

     Номер порта можно указывать статически или динамически:

          1. Статическое  указание  порта  возможно  при  непосредственном
     использовании значения от 0 до 255:

               Ввод:   IN     AL.порт#       ;Ввод одного байта
               Вывод:  OUT    порт#,АХ       ;Вывод одного слова

          2. Динамическое указание порта устанавливается в регистре DX  от
     0  до  65535.  Этот  метод  удобен  для  последовательной   обработки
     нескольких портов. Значение в регистре DX в этом случае увеличивается
     в цикле на 1. Пример ввода байта из порта 60Н:

               MOV     DX,60H  ;Порт 60Н (клавиатура)
               IN      AL,DX   ;Ввод байта

     Ниже приведен список некоторых  портов  (номера  в  шестнадцатиричном
представлении):

          21        Регистры маски прерывании.
          40...42   Таймер/счетчик
          60        Ввод с клавиатуры
          61        Звуковой порт (биты 0 и 1)
          201       Управление  играми
          3B0...3BF Монохромный дисплей и параллельный адаптер печати
          3D0...3DF Цветной/графический  адаптер
          3F0...3F7 Дисковый контроллер

     Если, например, программа  запрашивает  ввод  с  клавиатуры,  то  она
выдает команду прерывания INT 16H.  В этом  случае  система  устанавливает
связь с BIOS, которая с помощью команды IN вводит байт с порта 60Н.
     На практике  рекомендуется  пользоваться  прерываниями  DOS  и  BIOS.
Однако можно также успешно обойтись без BIOS  при  работе  с  портами  21,
40...42, 60 и 201. Листинги BIOS  в  техническом  руководстве  по  IBM  PC
содержат различные примеры команд IN и OUT.


     ГЕНЕРАЦИЯ ЗВУКА
     ________________________________________________________________

     Компьютер имеет возможность генерировать звук посредством встроенного
динамика с постоянным  магнитом.  Можно  выбрать  один  из  двух  способов
управления динамиком или использовать оба в комбинации:  1)  использование
бита  1  порта  21  Н  для   активизации    микросхемы    Intel    8255A-5
(программируемый периферийный интерфейс) (РР1); 2) использование  триггера
программируемого  интервального  таймера  Intel  8353-5  (PIT).    Часовой
генератор выдает сигнал с  частотой  1,19318  МГц.  Таймер  PPI  управляет
триггером 2 через бит 0 порта 61 Н.
     Программа на рис.23.3 генерирует серию звуковых  нот  с  возрастающей
частотой.  Значение в поле DURTION  формирует  продолжительность  звучания
каждой ноты, а значение в поле TONE определяет частоту звучания.  В начале
работы программа считывает содержимое порта 61 Н  и  сохраняет  полученное
значение.  Команда CLI сбрасывает флаг прерываний, обеспечивая равномерное
звучание.  Интервальный таймер генерирует 18,2 такта в секунду,  что  (при
отсутствии CLI) прерывает выполнение программы и вызывает появление звука.
     Значение поля TONE определяет частоту звука:  большие  значения  дают
низкую частоту, а малые - высокую.  После того, как  подпрограмма  BIOSPKR
исполнит очередную ноту, она увеличивает частоту звука посредством  сдвига
вправо на 1 бит значения в поле TONE (т.е. делит значение поля TONE на 2).
Так  как  уменьшение  TONE  в  данном  примере  приводит   к    сокращению
продолжительности звучания,  то  подпрограмма  также  увеличивает  DURTION
посредством сдвига его значения на один  бит  влево,  т.е.  удваивает  это
значение.
     Программа завершается, когда содержимое поля TONE уменьшится до нуля.
Начальные значения  в  полях  DURTION  и  TONE  не  имеют  принципиального
значения.  Можно  поэкспериментировать  с  другими  значениями,  а   также
испытать  выполнение  без  команды  CLI.  Можно  изменить  программу   для
генерации звуков с уменьшающейся частотой, установив для этого в поле TONE
значение 01, а в поле DURTION - некоторое большее значение. В каждом цикле
при этом необходимо увеличивать значение в поле TONE и уменьшать  значение
в поле. DURTION. При достижении нуля в DURTION программу можно завершить.
     Можно использовать любые варианты исполнения последовательности  нот,
например, для привлечения внимания пользователя.

__________________________________________________________________________

TITLE   SOUND   (COM) Процедура для генерации звука
SOUNSG  SEGMENT PARA 'Code'
        ASSUME  CS:SOUNG,DS:SOUNG,SS:SOUNG
        ORG     100H
BEGIN:  JMP     SHORT MAIN
; -------------------------------------------------------
DURTION DW      1000            ;Время звучания
TONE    DW      256H            ;Высота (частота) звука
; -------------------------------------------------------
MAIN    PROC    NEAR
        IN      AL,61H          ;Получить и сохранить
        PUSH    AX              ; данные порта
        CLI                     ;Запретить прерывания
        CALL    B10SPKR         ;Произвести звук
        POP     AX              ;Восстановить значение
        OUT     61H,AL          ; порта
        STI                     ;Разрешить прерывания
        RET
MAIN    ENDP

B10SPKR PROC    NEAR
B20:    MOV     DX,DURTION      ;Установить время звучания
B30:
        AND     AL,11111100B    ;Очистить биты 0 и 1
        OUT     61H,AL          ;Передать на динамик
        MOV     CX,TONE         ;Установить частоту
B40:
        LOOP    B40             ;Задержка времени
        OR      AL,00000010B    ;Установить бит 1
        OUT     61H,AL          ;Передать на динамик
        MOV     CX,TONE         ;становить частоту
B50:
        LOOP    B50             ;Задержка времени
        DEC     DX              ;Уменьшить время звучания
        JNZ     B30             ;Продолжать?
        SHL     DURTION,1       ; нет - увеличить время,
        SHR     TONE,1          ; сократить частоту
        JNZ     B20             ;Нулевая частота?
        RET                     ; да - выйти
B10SPKR ENDP

SOUNSG  ENDS
        END     BEGIN
__________________________________________________________________________

     Рис.23.3 Генерация звука



ГЛАВА 24                          Справочник по директивам языка Ассемблер
__________________________________________________________________________

     Ц е л ь: подробно описать операторы и директивы языка Ассемблер.


     ВВЕДЕНИЕ
     ________________________________________________________________

     Некоторые особенности Ассемблера кажутся на первый  взгляд  несколько
странными.  Но после того, как вы ознакомились с  простейшими  и  наиболее
общими  свойствами  Ассемблера,  описанными  в  предыдущих   главах,    то
обнаружите, что описания в этой главе более  понятны  и  являются  удобным
руководством к программированию.  В данной  главе  представлены  операторы
атрибутов, операторы, возвращающие значение,  директивы  данных,  а  также
индексная адресация памяти.


     ИНДЕКСНАЯ АДРЕСАЦИЯ ПАМЯТИ
     ________________________________________________________________

     При прямой адресации памяти в одном из операндов команды  указывается
имя определенной переменной, например для переменной COUNTER:

               ADD  CX,COUNTER

     Во  время  выполнения  программы  процессор   локализует    указанную
переменную в памяти путем объединения величины смещения к этой  переменной
с адресом сегмента данных.
     При индексной адресации памяти ссылка на операнд  определяется  через
базовый или индексный регистр, константы, переменные  смещения  и  простые
переменные.  Квадратные скобки, определяющие операнды индексной адресации,
действуют  как  знак  плюс  (+).  Для  индексном  адресации  памяти  можно
использовать:

          - базовый регистр BX в виде [BX] вместе с  сегментным  регистром
     DS или базовый регистр BP в виде [BP] вместе с  сегментным  регистром
     SS. Например, с помощью команды

               MOV  DX,[BX]        ;Базовый регистр

     в регистр DX пересылается элемент, взятый по относительному адресу  в
     регистре BX и абсолютному адресу сегмента в регистре DS;
          - индексный регистр DI в виде [DI] или индексный  регистр  SI  в
     виде [SI], оба вместе с сегментным регистром DS.  Например, с помощью
     команды

               MOV  AX,[SI]        ;Индексный регистр

     в регистр AХ пересылается элемент, взятый по относительному адресу  в
     регистре SI и абсолютному адресу сегмента в регистре DS;
          - [константу],  содержащую  непосредственный  номер  или  имя  в
     квадратных скобках. Например, с помощью команды

               MOV  [BX+SI+4],AX   ;База+индекс+константа

     содержимое регистра АХ пересылается по адресу,  который  вычисляется,
     как сумма абсолютного адреса в регистре DS, относительного  адреса  в
     регистре BX, относительного адреса в регистре SI и константы 4;
          - смещение (+ или -) совместно с индексным операндом. Существует
Предыдущая страница Следующая страница
1 ... 66 67 68 69 70 71 72  73 74 75 76 77 78 79 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама