- •В.Ф. Гузик, с.М. Гушанский, в.А. Каляев, а.О. Пьявченко, а.И. Костюк основы программирования на языке «ассемблер»
- •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 Входные параметры: нет
- •1. Функция 2 прерывания int 21h
- •2. Функция 9 прерывание int 21h
- •Функция 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. Содержание
Прерывания dos для работы с клавиатурой.
Функция 7 прерывания int 21h
Входные параметры: нет
Ввод символа (его ASCII-кода) из буфера клавиатуры. Если буфер пуст (никакая клавиша не нажата), подпрограмма ждёт нажатия клавиши.
РЕЗУЛЬТАТ: в регистре al возвращается ASCII-код символа. Если нажата функциональная клавиша (например, F2) в al вернётся ноль. При этом чтобы прочитать СКЭН - код этой клавиши надо повторно вызвать int 21h c функцией 7.
ПРИМЕР 1: Проверить нажата ли клавиша q.
mov ah, 7
int 21h
cmp al, 'q' ; сравнение полученного кода с кодом q
jne m1 ; переход на метку m1 если «не равно»
ПРИМЕР 2: Выйти из программы по нажатию любой клавиши.
mov ah, 7
int 21h ; здесь программа будет «висеть» пока не будет нажата какая-
; либо клавиша mov ah, 4ch ; выход int 21h
Функция 6 прерывания int 21h.
Входные параметры: в dl – 0ffh
Если в буфере есть символ, то его код возвращается в регистре al, а флаг процессора zf устанавливается в 0. Если в буфере нет символа, zf устанавливается в 1, а в al – «мусор». То есть, в отличие от предыдущей функции, здесь не ждут нажатия клавиши (так называемый ввод без ожидания).
ПРИМЕР: Проверка на нажатие ESC (код ESC = 1bh).
mov dl, 0ffh
mov ah, 6
int 21h
jz m1 ; никакая клавиша не нажата (zf=1)
cmp al, 0
je m2 ; нажата функциональная клавиша (в al из int 21h вернулся 0)
cmp al, 1bh
je m3 ; нажата Esc
Функция 0ah прерывания int 21h.
Входные параметры: ds:dx - начальный адрес буфера в оперативной памяти
Ввод строки символов с клавиатуры в созданный заранее буфер. Формат буфера: в нулевом байте программист записывает ожидаемую длину строки, в первом байте подпрограмма вернет фактически набранную длину строки, далее будет записаны ASCII – коды набранных символов.
Вводимая строка набирается на клавиатуре и заканчивается нажатием клавиши ENTER. В результате в буфер помещается следующая информация:
байт 0 - ожидаемая длина строки;
байт 1 - фактическая длина строки;
байт 2 и далее - строка, заканчивающаяся ASCII-кодом клавиши ENTER (0dh).
ПРИМЕР: собираемся принять строку, состоящую из двадцати символов.
buf db 20, 0, 21 dup (0) ; сколько ожидаем, сколько получим, 20 байт под ; ожидаемый прием, плюс байт под код ENTER
.
.
.
mov ah, 0ah
mov dx, offset buf
int 21h ; здесь висим и ждем ввода информации
Пусть мы ввели 56 и нажали ENTER, тогда будем иметь в буфере (если смотреть в отладчике):
14 02 35 36 0D 00 …. 00
Здесь 14h – это 20 в шестнадцатеричной системе, 02 – число принятых символов, 35h – это ASCII – код цифры 5, 36h – ASCII – код цифры 6.
Прерывания bios для работы с клавиатурой
1. Функция 0 прерывания int 16h Входные параметры: нет
Чтение символа из буфера клавиатуры. Если клавиша символьная, в al возвращается её ASCII-код, а в ah - её СКЭН - код. Если клавиша функциональная, в al возвращается 0, а в ah -её СКЭН - код. Если в буфере нет символа, подпрограмма ждет нажатия клавиши.
ПРИМЕР: Проверка на нажатие клавиши «стрелкa – вверх». Это функциональная клавиша и её СКЭН - код = 48h.
mov ah, 0
int 16h
cmp al, 0
jne m1 ; нажата символьная клавиша
cmp ah, 48h
je m2 ; нажата «стрелка – вверх»
Примечание: прерывание int 16h имеет аналогичную функцию 10h, предназначенную для работы с расширенной (101 клавиша) клавиатурой.