АН=00: сброс системы контроллера дисковода
АН=01: определить состояние дисковода
АН=02: чтение секторов
АН=03: запись секторов
АН=04: верификация секторов
АН=05: форматирование дорожек
Содержание задания
1. Напишите программу, которая создает дисковый файл, содержащий записи из трех элементов: номера товара (пять символов), наименования товара (12 символов) и стоимости единицы товара (одно слово). Ввод этих значений должен осуществляться с клавиатуры.
2. Напишите программу, которая выводит на экран файл, созданный в вопросе
3. Напишите программу, выполняющую одно блочное чтение файла с приведенными ниже данными и выводящую каждую запись на экран:
Номер Цена Наименование
023 00315 Ассемблеры
024 00430 Компоновщики
027 00525 Компиляторы
049 00920 Компрессоры
114 11250 Редакторы
232 05635 Контроллеры
999 00000
4. Измените программу из вопроса 3 так, чтобы цены записывались на диск в двоичном формате.
5. Напишите команды для BIOS INT 13H, выполняющие чтение одного сектора в область памяти INDISK, с дисковода А, головки 0, дорожки 6 и сектора 3.
6. Напишите команды для BIOS INT 13H, выполняющие запись трех секторов из области памяти OUTDISK на дисковод В, головку 0, дорожку 8 и сектор 1.
Лабораторная работа №7
Цель работы: изучить возможность программ на языке Ассемблер для вывода информации на печатающее устройство
Общие сведения.
Вывод на принтер несколько проще, чем операции с экраном и диском. Для печати существует несколько операций, выполняющихся через DOS INT 2IH и INT 17H. Команды, посылаемые на принтер, включают коды "Прогон страницы", "Перевод строки" и "Возврат каретки".
Принтеры классифицируются по качеству печати. Матричный принтер формирует символы в виде матрицы точек и обеспечивает нормальный, узкий и широкий форматы символов. Более совершенные матричные принтеры обеспечивают точечную графику, наклонный шрифт, жирную печать и двойную плотность, а также могут печатать графические символы, напри -мер, символы игральных карт. Высококачественные печатающие устройства ограничены набором символов на сменной "ромашке" или барабане, но обеспечивают высокое качество печати и большое разнообразие шрифтов. Лазерные принтеры обладают преимуществами как для матричной графики, так и для качественной печати текстов.
Стандартные символы управления печатью включают следующие:
08 - возврат на шаг
09 - горизонтальная табуляция
0А - перевод строки
0B - вертикальная табуляция
0С - прогон страницы
0D - возврат каретки
Для печати в базовой версии DOS необходимо установить в регистре АН код функции 05, а в регистре DL - распечатываемый символ, а затем выполнить команду INT 2IH следующим образом
MOV АН, 05 ; запрос функции печати
MOV DL, char ; распечатываемый символ
INT 2IH ; вызов DOS
С помощью этих команд можно передавать на принтер управляющие символы. Однако, печать обычно предполагает вывод полной или частичной строки текста и пошаговую обработку области данных, отформатированной по строкам. Ниже показана программа печати полной строки. Сначала в регистр SI загружается начальный адрес области HEADG, а в регистр СХ - длина этой области. Цикл, начинающийся по метке Р20, выделяет очередной символ из области HEADG и посылает его на принтер. Так как первый символ области HEADG - "возврат каретки", а последние два - "перевод строки", то заголовок печатается в начале новой страницы и после него следует двойной интервал:
HEADG DB OCH, INDUSTRIAL BICycle Mfrs’, ODH, OAH, OАМ LEA SI, HEADG; установка адреса и
MOV CX, 27 ; длины заголовка
Р20:
MOV АН,05 ; запрос функции печати
MOV DL, [SI] ; символ из заголовка
INT 21H ; вызов DOS
INT SI ; следующий символ
LOOP P20
Пока принтер не включен, DOS выдает сообщения " out of paper". После включения питания программа начинает работать нормально. Для прекращения печати можно нажать клавиши CTRL/BREAK.
Прерывание BIOS INT 17H обеспечивает три различные операции, определенные содержимым регистра АН:
АН=0: Данная операция выполняет печать одного символа на три принтера по номерам 0,1 и 2 (стандартное значение - 0)
MOV АН, 00 ; запрос функции печати
MOV AL, CHAR ; символ, выводимый на печать
MOV DX, 00 ; выбор принтера о
INT 17H ; вызов BIOS
Если операция не может распечатать символ, то в регистре АН устанавливается значение 01.
АН=1: Инициализация порта печатающего устройства:
MOV АН, 01 ; запрос на инициализации порта
MOV DX, 00 ;выбор порта о
INT 17H ; вызов BIOS
Данная операция посылает на принтер символ "прогон страницы", поэтому ее можно использовать для установки положения "начало страницы". Большинство принтеров выполняют данную установку автоматически при включении.
АН=2: Чтение состояния порта принтера:
MOV АН, 02 ; функция чтения состояния порта
MOV DX, 00 ;выбор порта о
INT 17H ; вызов BIOS
TEST АН, 01101001В ; принтер готов?
JNZ errmsg ; нет - выдать сообщение
В процессе работы принтер может выйти за страницу или быть нечаянно выключен. Поэтому в программах печати следует предусмотреть проверку состояния принтера перед каждой проверкой печати.
Содержание задания
Напишите программу для DOS, выполняющую: а) прогон страницы; б) Печать вашего имени; в) перевод строки и печать вашего адреса; г) перевод строки и печать названия вашего города; д) прогон страницы.
2. Закодируйте строку, в которой имеется следующая информация: возврат каретки, прогон страницы, включение узких букв (OF), заголовок (ваша фамилия) и выключение узких букв (12).
3. Измените программу из вопроса 1 для использования BIOS INT 17H. Обеспечьте проверку состояния принтера.
4. Измените программу из вопроса 1 так, чтобы пункты б), в), г), выполнялись по 5 раз.
Лабораторная работа №8.
Изучение связей между подпрограммами.
Цель работы. Раскрыть технологию программирования, включающую компоновку и выполнение программ.
Общие сведения.
Возможно выполнение программного модуля, состоящего из нескольких ассемблированных программ. В этом случае программу можно рассматривать как состоящую из основной программы и одной или более подпрограмм. Причины такой организации программ состоят в следующем:
- необходимо скомпоновать программы, написанные на разных языках, например, для объединения мощности языка высокого уровня и эффективности ассемблера;
- программа, написанная в виде одного модуля, может оказаться слишком большой для ассемблирования;
- отдельные части программы могут быть написаны на разными группами программистов, ассемблирующих свои модули раздельно;
- ввиду возможного большого размера выполняемого модуля может появиться необходимость перекрытия частей программы в процессе выполнения.
Каждая программа ассемблируется и генерирует собственный универсальный объект (OBJ) модуль. Программа-компоновщик (LINK) затем компонует объектные модули в один объединенный выполняемый (ЕХЕ) модуль. Обычно выполнение начинается с основной программы, которая вызывает одну или более подпрограмм. Подпрограммы, в свою очередь, могут вызывать другие подпрограммы.
Для межсегментного вызова используется команда CALL. Данная операция сначала записывает в стек содержимое регистра CS и заносит в этот регистр адрес другого сегмента, затем записывает в стек значение регистра ТР и заносит новый относительный адрес в этот регистр.
Таким образом, в стеке запоминаются и адрес кодового сегмента, и смещение для последующего возврата из подпрограммы.
Например, межсегментный вызов CALL может состоять из следующего объектного кода:
9А 002 AF04
Шестнадцатеричное число 9А представляет собой код команды межсегментного вызова, которая записывает значения 0002 в виде 0200 в регистр IP, а значение AF04 в виде 04 AF - в регистр CS. Комбинация этих адресов указывает на первую выполняемую команду в вызываемой подпрограмме:
кодовый сегмент 04AF0
смещение в IP 0200
действительный адрес 04CF0
При выходе из вызванной процедуры межсегментная команда возврата REP восстанавливает оба адреса в регистрах CS и IP и таким образом передает управление наследующую после CALL команду.
Содержание задания
1. Программа MAINPRO должна вызвать подпрограмму SUBPRO. В программе MAINPRO определены переменные QTY как DB, VALUE как DW и PRICE как DW. Подпрограмма SUBPRO должна разделить VALUE на QTY и записать частное a PRICE. Постройте работающую программу и проверьте ее.
2.Измените программу так, чтобы программа MAINPRO передавала все три переменные, как параметры. Подпрограмма SUBPRO должна возвращать результат через параметр.
3.Составьте программу так, чтобы программа MAINPRO позволяла вводить количество (QTY) и общую стоимость (VALUE) с клавиатуры;
подпрограмма SUBCONV преобразовывала ASCII - числа в двоичное представление; подпрограмма SUBCALC вычисляла цену (PRICE);
подпрограмма SUBDISP преобразовала двойную цену, выводила результат на экран в коде ASCII.