- •В.Ф. Гузик, с.М. Гушанский, в.А. Каляев, а.О. Пьявченко, а.И. Костюк основы программирования на языке «ассемблер»
- •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. Содержание
2. Функция 1 прерывание int 16h Входные параметры: нет
Функция похожа на предыдущую, только не ждет нажатия клавиши. Если в буфере нет символов, флаг zf устанавливается в единицу. Внимание, эта функция не очищает буфер при считывании символа (от этого символа). То есть, если мы этой функцией прочтем символ из буфера, то в следующий раз мы прочтем оттуда тот же символ, и так до бесконечности. Решить эту проблему можно, например, так:
mov ah, 1
int 16h
jz nott ; в буфере нет символа, уходим на метку nott
mov al, 0
int 16h ; читаем символ и очищаем буфер
А почему нельзя было здесь сразу использовать int 16h с функцией 0 ? Дело в том, что если у нас на экране что-то движется вне зависимости от нажатия клавиш (например, летает шарик), мы не можем останавливаться и ждать нажатия клавиши (на время ожидания шарик пропадет). В приведенном выше фрагменте мы проверяем буфер и, если в нем нет символа, прыгаем на дальнейшее обслуживание экранного движения. И только если в буфере гарантированно есть символ, мы используем int 16h с функцией 0.
Примечание: прерывание int 16h имеет аналогичную функцию 11h, предназначенную для работы с расширенной (101 клавиша) клавиатурой.
ПРЕРЫВАНИЯ DOS ДЛЯ РАБОТЫ С ЭКРАНОМ
1. Функция 2 прерывания int 21h
Входные параметры: в dl ASCII-код символа.
Выводит заданный символ в текущую позицию курсора. Курсор после вывода смещается на позицию вправо. Коды 7, 8, 0ah и 0dh (эти коды также задаются в dl) на экран не выводятся, а управляют перемещением курсора: 8 - на символ влево, 0ah - на строку вниз, 0dh - на начало строки, 7 – звонок.
ПРИМЕР: Вывести букву А в текущую позицию курсора.
mov ah, 2
mov dl, 'A'
int 21h
2. Функция 9 прерывание int 21h
Входные параметры: в ds:dx адрес начала строки в оперативной памяти
Выводит, начиная с текущей позицией курсора, строку символов из оперативной памяти. Конец строки задается символом $. Коды 7, 8, 0ah и 0dh являются управляющими.
ПРИМЕР:
stroka db 'Я, ребята, студент',0dh,0ah,'$'
.
.
mov ah, 9
mov dx, offset stroka
int 21h
ПРЕРЫВАНИЯ BIOS ДЛЯ РАБОТЫ С ЭКРАНОМ
Функция 1 прерывание int 10h
Входные параметры: в ch (биты 4-0) верхняя строка развертки курсора, в cl (биты 4-0) нижняя строка развертки курсора.
Подпрограмма позволяет установить конфигурацию (размер по вертикали) курсора. Стандартно (для цветных мониторов) верхняя граница курсора равна 6, а нижняя – 7. Если взять верхнюю границу равной 0, а нижнюю оставить равной 7, курсор будет максимально большим. Это же прерывание позволяет гасить курсор (делать его невидимым). Для этого надо взять ch = 20, cl = 0.
Пример:
mov ah, 1
mov ch, 20
mov cl, 0
int 10h
Фрагмент программы с такими параметрами гасит на экране курсор. Однако если Вы хотите скрыть курсор, советуем сделать это в самый последний момент, когда вся программа уже отлажена. Скрытый курсор может мешать процессу отладки, так как зачастую ошибка заключается в неправильном позиционировании курсора (за пределами экрана).