- •В.Ф. Гузик, с.М. Гушанский, в.А. Каляев, а.О. Пьявченко, а.И. Костюк основы программирования на языке «ассемблер»
- •1. Введение для кого написано это учебное пособие.
- •2. Предварительные сведения или азы, которые необходимо знать!
- •2.1. Ассемблер, что это такое?
- •2.2. Как писать ассемблерную программу, и какие программы нужны для ее последующей трансляции.
- •2.3. Системы счисления
- •2.4. Оперативная память.
- •2.5. Стек
- •Сегментация памяти.
- •Программная модель процессора.
- •Система команд.
- •Inc word ptr [bx]
- •2.9 Выделение памяти под переменные и массивы
- •2.10 Exe и com программы
- •2.11 Трансляция ассемблерной программы
- •Passes: 1
- •Примеры программирования на ассемблере.
- •3.1. Наша первая программа.
- •3.2. Работа с клавиатурой и экраном.
- •Прерывания dos для работы с клавиатурой.
- •Функция 7 прерывания int 21h
- •Функция 6 прерывания int 21h.
- •Функция 0ah прерывания int 21h.
- •Прерывания bios для работы с клавиатурой
- •1. Функция 0 прерывания int 16h
- •Входные параметры: нет
- •2. Функция 1 прерывание int 16h
- •Входные параметры: нет
- •Прерывания dos для работы с экраном
- •1. Функция 2 прерывания int 21h
- •2. Функция 9 прерывание int 21h
- •Прерывания bios для работы с экраном
- •Функция 1 прерывание int 10h
- •Функция 2 прерывание int 10h
- •Функция 3 прерывание int 10h
- •Функция 6 прерывание int 10h
- •Функция 9 прерывание int 10h
- •Функция 0eh прерывания int 10h
- •Задания к лабораторной работе «Клавиатура и экран»
- •Работа с гибкими дисками.
- •Inc nomber
- •3.4. Перехват прерываний и создание резидентных программ
- •Inst: mov ah, 9
- •Inst: mov ah,9
- •3.5. Работа со звуком.
- •Отладка программ.
- •Приложение
- •Сервисные прерывания dos.
- •Сервисные прерывания bios.
- •Int 10h, функция 07h. Инициализация или прокрутка окна вниз.
- •Int 10h, функция 08h. Чтение символа и атрибута в позиции курсора.
- •Int 10h, функция 09h. Запись символа и атрибута в позицию курсора.
- •Int 10h, функция 0ah. Запись символа в позицию курсора.
- •Int 10h, функция 0eh. Запись символа в режиме телетайпа.
- •Int 10h, функция 10h, подфункция 03h. Переключение бита «мерцание/яркость».
- •Int 10h, функция 13h. Запись строки в режиме телетайпа.
- •Int 15h, функция 86h. Программная задержка на заданное число микросекунд.
- •Int 16h, функция 00h (10h). Чтение символа с клавиатуры.
- •Int 16h, функция 01h (11h). Чтение символа с клавиатуры.
- •Int 16h, функция 02h (12h). Получение статуса клавиатуры.
- •Int 1ah, функция 0h. Число тиков таймера.
- •Коэффициенты пересчета для нот
- •Значение цветов в байте атрибута
- •Буфер клавиатуры.
- •Литература
- •7. Содержание
3.2. Работа с клавиатурой и экраном.
Информация, которую компьютер выводит на экран, располагается в определенной области памяти. В стандартном текстовом режиме (а именно в этом режиме мы и предполагаем работать) эта область начинается с адреса b8000h. В этом режиме экранная область памяти разбита на несколько страниц. В любой момент времени на экран выводится содержимое одной из этих страниц, она называется активной. Таким образом, программист может заранее подготовить информацию в пассивной странице, а затем быстро сделать эту страницу активной. Но мы этим заниматься не будем, а будем всегда работать только с нулевой страницей. В рассматриваемом текстовом режиме экран имеет 25 строк (нумерация 0 – 24) и 80 столбцов (0 – 79). Таким образом, для описания текущего состояния экрана в памяти отводится 25*80 = 2000 слов. Каждое из этих слов описывает одно знакоместо. В младшем байте такого слова содержится ASCII – код выводимого символа, а в старшем байте – атрибуты, с которыми этот символ выводится на экран (цвет символа и цвет фона в знакоместе). Байт атрибутов имеет формат, представленный на рис 3.1 (подробней смотри Приложение).
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
рис. 3.1
Здесь разряды D2 – D0 определяют цвет символа (000 – черный, … 111 – белый). Разряд D3 задает яркость цвета символа. Разряды D6 – D4 задают цвет фона (000 – черный, … 111 – белый). Разряд D7 задает яркость фона или, значительно реже, мигание символа. Назначение разряда D7 (мигание/яркость) можно менять программным путем (смотри раздел 5.2 в Приложении).
Все клавиши на клавиатуре можно разделить на символьные и функциональные. Символьные клавиши (а, б, …1, 2,...) вводят в компьютер символы, которые впоследствии можно отображать на экране. То есть для символьных клавиш имеется их ASCII – код. Функциональные клавиши (F1,…DEL,…INS, …) ASCII – кода не имеют. Когда мы нажимаем любую клавишу на клавиатуре, происходит следующее. Контроллер клавиатуры выставляет СКЭН – код (номер) нажатой клавиши в порт с адресом 60h и, через контроллер прерываний, формирует на процессор запрос на прерывание. В IBM – подобных компьютерах этому запросу присвоен тип 9 («девятое прерывание»). Обработчик «девятого прерывания» читает СКЭН – код из порта 60h, переводит его в ASCII – код, если нажата символьная клавиша (для функциональных ASCII – код берется равным 0), и помещает и СКЭН и ASCII код в расположенный в памяти кольцевой буфер клавиатуры (подробно буфер клавиатуры описан в Приложении). Программы же считывают информацию уже из этого буфера.
Конечно, мы можем напрямую работать с видеопамятью и кольцевым буфером. Например, для того чтобы очистить экран, достаточно записать во все слова видеопамяти ASCII – код пробела с соответствующими атрибутами. Допустим, так:
mov cx, 2000 ; число повторений цикла
mov ax, 0b800h
mov es, ax ; настраиваем es на начало видеопамяти
mov si, 0 ; в si смещение в видеопамяти
cikle:
mov word ptr es:[si], 7020h ; записываем в текущее знакоместо код и атрибуты ; 20h – ASCII – код пробела, 70h – «черным по белому»
add si, 2 ; переходим к следующему знакоместу (слову)
loop cikle
Однако, работа с аппаратурой напрямую, хотя и обеспечивает наиболее высокое быстродействие, чревата ошибками. Поэтому мы рекомендуем новичкам пользоваться сервисными подпрограммами, которые DOS и BIOS предоставляют пользователю через программные прерывания int n. Далее приводится далеко не полный перечень прерываний, обеспечивающих сервис по работе с экраном и клавиатурой.