
- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Вывод на экран двоичного числа
MOV BX, 0A3C5H
MOV CX, 0008
CYCLE:
RCL BX, 1 ; циклический сдвиг BX на 1 разряд вправо
LOOP CYCLE ; пока СХ=СХ-10
INT 20H
MOV AH, 02 ; номер функции в AH – печать символа из DL
MOV CX, 0008 ; количество сдвигов
MET: MOV DL, 00
RCL BL, 1
ADC DL, 30
INT 21H
LOOP MET
INT 20H
Работа с дисковыми файлами
В DOS доступны следующие функции работы с файлами:
39h – создать каталог файлов (аналогично функции MKDIR DOS)
перед использованием
DS:DX – адрес ASCIIZ – строки –имя пути для нового каталога.
Ошибки в АХ: 3 - путь не найден
5 – ошибка в доступе
3Аh – удалить каталог
DS:DX – адрес ASCIIZ – строки –имя пути для нового каталога.
Ошибки в АХ те же.
3Вh – сменить текущий каталог
DS:DX – то же
АХ – 3
3Сh – создать файл (CREATE)
открывает существующий или создает новый файл.
DS:DX – адрес ASCIIZ строки.
СХ – аттрибут файла
АХ – возвращается логический номер файла.
Логический номер файла или дескриптор – это 16-битовое число, используемое DOS как указатель на систему таблиц. Логический номер освобождается после закрытия файла и может быть использован повторно.
Существует пять стандартных логических номеров 0-4, которые автоматически предоставляются любой программе. Остальные номера с большими логическими номерами DOS предоставляет по требованию.
Логический номер |
Использование |
Устройство по умолчанию |
0 |
Стандартный ввод (клавиатура) |
CON: |
1 |
Стандартный вывод (экран) |
CON: |
2 |
Стандартное устройство вывода при ошибке |
CON: |
3 |
Стандартное вспомогательное устройство |
AUX: |
4 |
Стандартное устройство печати |
PRN: |
АSCIIZ-строка
Функции DOS, работающие с файлами, требуют задания имени и пути к файлу в виде ASCIIZ строки. ASCIIZ строка состоит из обычных ASCII символов, за которыми следует нулевой байт. Типичная строка выглядит наподобие:
C:\DIRECTORY1\DIRECTORY2\FILENAME.EXT
В качестве разделителя может быть как прямая, так и обратная косая черта. (имя дисковода может быть опущено)
В СХ, а точнее, в СL – аттрибут файла
0 – отсутствие аттрибутов
1 – только чтение
2 – скрытый файл
4 – системный
8 – метка тома
16 = 10h – подкаталог
32 = 20h – архив – этот разряд сброшен для всех файлов, которые изменялись после последнего копирования.
После выполнения всех необходимых действий по созданию файла, функция 3Сh возвращает в регистре АХ дескриптор созданного файла, которым могли в дальнейшем пользоваться для записи в файл или чтения из него. Если файл с заданным именем уже существовал, функция 3Сh фактичеки уничтожит имеющийся файл и создаст новый с тем же именем.
Так как АХ используется для возврата как логического номера, так и кода ошибки, то в качестве признака ошибки необходимо использовать флаг CF (флаг переноса).
Возможны коды возврата:
3 – путь не найден
4 – нет свободного логического номера
5 – отказ в доступе – либо в каталоге нет места
Для новой записи, либо уже существующий файл защищен от записи и не может быть открыт для вывода данных.
Функция 3Dh - открыть файл (OPEN)
DS:DX – адрес строки, содержащей путь и имя файла
AL - код режима открытия
Рассмотрим только разряды 02.
-
2
1
0
000
001
010
Только чтение
Только запись
Чтение/запись
Бит 7 – бит наследования
Биты 4-6 – режимы совместного использования.
Коды возврата в АХ:
2 – файл не найден
3 – путь не найден
4 – нет свободного логического номера файла
5 – отказ в доступе
12 – недопустимый код доступа
3Eh – закрытие файла
Логический номер в ВХ.
Код ошибки 6 – ошибочный логический номер.
3Fh – читать данные изфайла или устройства
Логический номер - ВХ.
Число байт – СХ
Адрес буфера – DS:DX
В АХ возвращается число действительно считанных байтов. Если в АХ 0, то программа пыталась считать данные за концом файла.
Код ошибки:
5 – отказ в доступе
6 – ошибочный логический номер.
40h – вывести данные в файл или на устройство (WRITE)
Логический номер - ВХ.
Число байт – СХ
Адрес выводимых данных – DS:DX
В АХ возвращается число действительно выведенных байтов.
Проверка состоит их 2х шагов
СF
AX = ? CX. Если АХ<СХ – на диске не хватило места.
41h – удалить файл.
DS:DX – адрес строки, определяющей имя файла.
Заполнители ? и * в имени файла использовать нельзя.
42h – переместить указатель текущей позиции в файле.
Логический номер – ВХ.
Новое положение указателя задается путем загрузки в регистр AL исходного положения указателя, а в пару регистров СХ:DX – число байтов, на которое необходимо переместить указатель. Загружаемое в пару регистров СХ:DX смещение в байтах – это 32-битовое число без знака. В СХ – старшая часть, в DX – младшая. Если смещение меньше 65535, то СХ = 0. Исходное положение в АL задается с помощью так называемого кода метода:
АL = 0 – смещение берется от начала файла и указатель изменяется на СХ:DX от этой точки
АL = 1 – смещение берется от текущей позиции
АL = 2 – смещение берется от конца файла.
В последнем случае в паре регистров СХ:DX обычно ноль, чтобы определить текущий размер файла. Если задать смещение 0 и запросить метод 0 – то возврат в начало файла.
Коды ошибок:
1 – ошибочный номер функции
6 – ошибочный логический номер
Пример
; создание файла
MOV AH, 3Ch ; Функция CREATE
MOV CX, 0 ; Без аттрибутов
MOV DX, OFFSET Filename ; Адрес имени Файла
INT 21h ; ВЫзов DOS
Jc error1 ; ошибка
Mov Handler, AX ; сохраним дескриптор
; запись строки в файл
MOV AH, 40h ; Функция записи
MOV BX, Handler ; Дескриптор
MOV CX, BufLen ; Число записываемых байтов
MOV DX, OFFSET Buf ; Адрес буфера
INT 21h
Jc error2
; закрытие файла
MOV AH, 3Eh ;
MOV BX, Handler
INT 21h
Jc error3
; завершение программы
MOV AX, 4C00h ; Функция завершения
INT 21h
error1: …
error2: …
error3: …
; данные
Buf DB ‘0123456789’ ; Данные, записываемые в файл
BufLen EQU $ - Buf ; Длина данных. $ - текущее значение счетчика
Handler DW ? ; Ячейка для дескриптора
Filename DB ‘D:\test\myfile.001’,0 ; ASCIIZ строка спецификации файла
В простых программах файлы можно не закрывать, так как функция завершения 4Ch закрывает все открытые файлы программы.
Рассмотрим пример программы с имеющимся файлом:
; Открыть файл
MOV AH, 3Dh ; функция OPEN
MOV AL, 2 ; Доступ для чтения/записи
MOV DX, OFFSET Filename ; Адрес имени файла
INT 21h
Jc error1
MOV Handler, AX ; Сохранение дескриптора
; Пытаемся прочитать 65535 байт
MOV AH, 3Fh ; Функция READ
MOV BX, Handler ; Дескриптор
MOV CX, 65535 ; Сколько читать
MOV DX, OFFSET BufIn ; Сюда читать
INT 21h
Jc error2
MOV CX, AX ; сколько реально прочитано
; Вывод прочитанного на экран
MOV AH, 40h ; функция WRITE
MOV BX, 1 ; Дескриптор стандартного вывода
MOV DX, OFFSET BufIn ; отсюда выводить (СХ байт)
Int 21h
; завершение программы
MOV AX, 4C00h ; Функция завершения
INT 21h
error1: …
error2: …
error3: …
; Данные
BufIn DB 256 dup (‘ ‘) ; буфер ввода
Handler DW ?
Filename DB ‘D:\test\myf.001’,0 ; спецификация файла
В данном случае на экран.
Удобнее вывести с помощью 40h, так как мы не занем длину выводимого сообщения, то есть не знаем, куда поставить ‘$’ для функции 9h.
Анализ системных ошибок
MOV AH, Function ; Номер функции
; Заполнение регистров параметрами, необходимыми для
; выполнения данной функции
INT 21h
JC Error ; флаг СF установлен
; Нет, нормальное продолжение программы
…………..
Error: ….
; Да, анализ ошибок в АХ
CMP AX, 1
JE Error1
CMP AX, 2
JE Error2
…..
43h – получить, установить аттрибуты файла
56h – переименовать файл
57h – получить/установить дату и время последнего изменения файла
в DOS 3.00
5Ah – создать временный файл
CX - аттрибут
DS:DX – имя пути, должно заканчиваться ‘\’
Строка должна иметь длину на 12 байт больше длины имени пути, чтобы DOS могла бы дополнить уникальным именем файла.
5Bh – создать новый файл
В отличие от 3Сh, если файл уже существует, то 5Bh сообщает об ошибке.
5Сh – блокировать/разблокировать доступ к файлу.