- •В.Ф. Гузик, с.М. Гушанский, в.А. Каляев, а.О. Пьявченко, а.И. Костюк основы программирования на языке «ассемблер»
- •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.
Информация в этом и следующем разделах пособия в основном взята из книги Финогенова К. Г. «Самоучитель по системным функциям MS DOS».
INT 21h, функция 01h. Ввод символа с эхом. Вводит ASCII код символа с клавиатуры, при этом вводимый символ автоматически отображается на экране в позиции курсора (эхо – отображение). Для чтения СКЭН кода клавиши требуется повторное выполнение этой функции. При отсутствии символа функция ждет его ввода. При вызове: ah = 01h При возврате: al = ASCII (СКЭН) код символа
INT 21h, функция 02h. Вывод символа. Выводит символ на экран. Коды ASCII: 07h – звонок, 08h – шаг назад, 09h – табуляция, 0dh – возврат каретки, 0ah – перевод строки, рассматриваются как управляющие и выполняют соответствующие действия. При вызове: ah = 02h dl = ASCII код выводимого символа.
INT 21h, функция 06h. Прямой ввод - вывод. Вводит код символа с клавиатуры или выводит его на экран. В режиме вывода коды ASCII: 07h – звонок, 08h – шаг назад, 0dh – возврат каретки, 0ah – перевод строки, рассматриваются как управляющие и выполняют соответствующие действия. Для чтения СКЭН кода требуется повторное выполнение данной функции. При вводе функция не ждет нажатия клавиши, а возвращает управление в программу. При вызове: ah = 06h dl = ASCII код символа (00-FEh) при выводе dl = FFh при вводе При возврате: al = ASCII код символа при вводе, если символа нет, zf = 1
INT 21h, функция 07h. Нефильтрованный ввод без эха. Аналогична функции 01h (смотри выше), только нет эхо – отображения.
INT 21h, функция 08h. Ввод символа без эха. Практически аналогична функции 07h.
INT 21h, функция 09h. Вывод строки. Выводит на экран строку символов. Строка должна заканчиваться символом $. Коды ASCII: 07h – звонок, 08h – шаг назад, 0dh – возврат каретки, 0ah – перевод строки, рассматриваются как управляющие и выполняют соответствующие действия. При вызове: ah = 09h ds:dx = адрес первого символа строки
INT 21h, функция 0ah. Буферизированный ввод с клавиатуры. Вводит строку символов с клавиатуры в созданный в программе буфер. Вводимая строка отображается на экране. Строка должна заканчиваться кодом ENTER (0dh). При вызове: ah = 0ah ds:dx = адрес буфера При возврате: Данные помещены в буфер. Формат буфера: байт 0 – ожидаемая длина строки байт 1 – фактическая длина введенной строки байт 2 и далее – строка, заканчивающаяся 0dh. Ожидаемую длину строки проставляет программист при создании буфера. При этом ввести больше символов, чем ожидается, невозможно.
INT 21h, функция 25h. Установка вектора прерывания. Позволяет записать новый вектор в заданное место таблицы прерываний. При вызове: ah = 25h al = тип подменяемого вектора ds:dx = новый вектор
INT 21h, функция 2ah. Получение текущей даты. При вызове: ah = 2ah При возврате: cx = год (от 1980 до 2099) dh = месяц (от 1 до 12) dl = день (от 1 до 31) al = день недели (0 – воскресенье и. т. д.)
INT 21h, функция 2ch. Получение текущего времени. При вызове: ah = 2ch При возврате: ch = часы (от 0 до 23) cl = минуты (от 0 до 59) dh = секунды (от 0 до 59)
INT 21h, функция 31h. Завершение программы и сохранение ее резидентной в памяти. При вызове: ah = 31h dx = объем оставляемой в памяти части программы Объем оставляемой части измеряется здесь в параграфах. Параграф – 16 байт. Если нам известен объем в байтах (n), то объем в параграфах считается так:(целое от n/16) + 1.
INT 21h, функция 4ch. Завершение процесса. Завершает текущий процесс (программу), освобождая всю выделенную процессу память. При вызове: ah = 4ch
INT 25h. Абсолютное чтение с диска. Позволяет прочитать в память (в созданный программистом буфер) с диска группу секторов, начиная с заданного. После этого прерывания в стеке задачи остается слово, содержащее значение регистра флагов. Если это слово не удалить, может нарушиться дальнейший ход программы. При вызове: al = номер дисковода (0 – А, 1 – В,…) cx = число читаемых секторов dx = логический номер начального сектора ds:bx = начальный адрес буфера При ошибке: флаг cf = 1 ax = код ошибки Примечание Коды ошибки в ah: 01h – неправильная команда 02h – неправильная адресная метка 04h – запрошенный сектор не найден 08h – ошибка прямого доступа к памяти 10h – ошибка данных (неправильная контрольная сумма) 20h – ошибка контроллера 40h – ошибка позиционирования
Коды ошибки в al: 00h – ошибка защиты записи 01h – неизвестное устройство 02h – дисковод не готов 03h – неизвестная команда 04h – ошибка данных (неправильная контрольная сумма) 06h – ошибка позиционирования 07h – неизвестный тип носителя
08h – сектор не найден
INT 26h. Абсолютная запись на диск. Позволяет записать из памяти на диск группу секторов, начиная с заданного, из созданного в памяти буфера. После этого прерывания в стеке задачи остается слово, содержащее значение регистра флагов. Если это слово не удалить, может нарушиться дальнейший ход программы. При вызове: al = номер дисковода (0 – А, 1 – В,…) cx = число записываемых секторов dx = логический номер начального сектора ds:bx = начальный адрес буфера При ошибке: флаг cf = 1 ax = код ошибки (смотри INT 25h)
INT 27h. Завершить программу, оставив в памяти ее резидентную часть. При вызове: dx = размер оставляемой в памяти части в байтах.