Лабораторные работы по системному ПО
СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
Методические указания к лабораторному практикуму для студентов всех форм
обучения специальности ???
1998г.
Лабораторная работа № 1.
Изучение архитектуры ЭВМ. Машинное исполнение, Требования языка Ассемблер.
Цель работы. Объяснить особенности технических средств микрокомпьютера
и организации программного обеспечения. Изучить машинный язык, ввод команд
в память и выполнение программ. Показать основные требования к программам
на языке Ассемблер и этапы ассемблирования, компоновки и выполнения
программы.
Общие сведения.
Написание ассемблерных программ требует знание организации всей системы
компьютера. В основе построения логики блоков компьютера лежат понятия бита
и байта. Они являются теми средствами, благодаря которым в компьютерной
памяти представляются данные и команды. Программа в машинном коде состоит
из различных сегментов: Для определения данных, для машинных кодов и для
сегмента, называемого стеком , для хранения адресов. Для выполнения
арифметических действий, пересылки данных и адресов компьютер имеет 14
регистров.
Машинные коды имеют различную длину: 1,2 или 3 байта. Машинные команды
находятся в памяти непосредственно друг за другом. Основной формат
кодирования команд Ассемблера имеет следующий вид:
[метка] команда [операнды]
Метка (если имеется), команда и операнд (если имеется) разделяется, по
крайней мере, одним пробелом или символом табуляция.
С целью стандартизации в микрокомпьютерах используется стандартный
американский код для обмена информацией ASCII.
Содержание задания.
1. Имеется команда:
ECS: 100 B8 04 30 05 00 30 СВ
Что делает данная программа?
2. Напишите программу, выполняющую следующую операцию:
• Пересылка значения 25Н в регистре AL
• Сдвиг содержимого регистра AL на 1 бит влево
• Пересылка значения 15Н в регистр BL
• Умножение содержимого регистра AL на содержимое регистра BL
3. Для сегментов кода, данных и стека даны имена CDSEA, DATSEA и STKSEA
соответственно. Сформируйте директиву ASSUME.
Лабораторная работа № 2
Логика и организация программы
Цель работы: раскрыть механизм передачи управления в программе (циклы и
переходы) для логических сравнений и программной организации.
Общие сведения.
Большинство программ содержат ряд циклов, в которых несколько команд
повторяются до достижения определенного требования, и различные проверки,
определяющие, какие из нескольких действий следует выполнять. Эти действия
включают управление по адресу команды, которая не находится непосредственно
за выполняемой в текущий момент командой. Передача управления может
осуществляться вперед для выполнения новой группы команд или назад для
повторения уже выполненных команд.
Некоторые команды могут передавать управление, изменяя нормальную
последовательность шагов непосредственной модификацией значения смещения в
командном указателе.
Одна из команд, используемых для передачи управления - команда JMP. Эта
команда выполняет безусловный переход, т.е. обеспечивает передачу
управления при любых обстоятельствах. Пример оформления команды
JMP A20,
Команда указывает на то, что управление должно быть передано команде с
меткой A20. Для выполнения определенного количества циклов используется
команда LOOP. В каждом цикле команда LOOP автоматически уменьшает
содержимое регистра СХ на 1. Пока значение в СХ не равно 0, управление
передается по адресу, указанному в операнде, и если в СХ будет 0,
управление переходит на следующую после LOOP команду. Пример оформления
команды:
LOOP A20.
Для передачи управления подпрограмме используется команда CALL XXX,
например
CALL A20.
В результате действия команды CALL управление передается процедуре A20
и начинается ее выполнение. Достигнув команды RET, управление передается на
команду, непосредственно следующую за CALL A20.
Содержание задания.
1. Напишите программу для вычисления 12 чисел Фибоначчи:
1,1,2,3,5,8,13,...(каждое число в последовательности представляет собой
сумму двух предыдущих чисел). Для организации цикла используйте команду
LOOP.
2. Напишите программу для вычисления сумму первых 15 нечетных чисел
Фибоначчи с первыми 5 четными числами Фибоначчи. Суммы должны вычисляться в
подпрограммах.
Лабораторная работа .№ 3
Изучение экранных операций
Цель работы: Объяснить требования для вывода информации на экран, а
также для ввода данных с клавиатуры.
Общие сведения.
Данные, предназначенные для вывода на экран и ввода с клавиатуры, имеют
ASCII - формат. Для выполнения ввода и вывода используется команда INT,
которая прерывает обработку программы, передает управление в DOS или BIOS
для определенного действия и затем возвращает управление в прерванную
программу для продолжения обработки. Имеются два типа прерываний: команда
BIOS INT 10Н и команда DOS INT 21H.
Команда INT 10Н включает в себя установку курсора в любую позицию и
очистку экрана. Ниже приведены примеры установки курсора на S - ю строку и
12 столбец.
MOV АН, 02 ; запрос на установку курсора
MOV ВН, 00 ; экран 0
MOV DH, 05 ; строка 05
MOV DL, 12 ; столбец 12
INT 10Н ; передача у правления в BIOS
И очистки всего экрана
MOV АН, 0600 ; АН 06 (прокрутка) AL 00 (весь экран)
MOV BH, 07 ; нормальный атрибут
MOV СХ, 0000 ; верхняя левая позиция
MOV DX, 184FH ; нижняя правая позиция
INT 10H ; передача управления в BIOS
Значение 02 в регистре АН указывает команде INT 10Н на выполнение
операции установки курсора. Значение 06 в регистре АН указывает на
выполнение операции очистки экрана.
Вывод на экран в DOS требует определения текстового сообщения в области
данных, установки в регистре АН значения 09 и указания команды DOS INT 21H.
В процессе выполнения операции конец сообщения определяется по ограничителю
($), как показано ниже:
INT 10H DB 'имя студента?', ‘$’
.
.
MOV АН, 09 ; запрос вывода на экран
LEA DX, INT 10Н ; загрузка адреса со общения
INT 21H ; вызов DOS
Для ввода данных с клавиатуры, область ввода требует наличия списка
параметров, содержащего спецификацию полей, которые необходимы при
выполнении команды INT: максимальная длина вводимого текста; поле, куда
команда возвращает действительную длину введенного текста в байтах. Для
запроса на ввод необходимо поместить в регистр АН номер функции – 10(OAH),
загрузить адрес списка параметров в регистр DX и выполнить INT 21H.
Содержание задания.
1. Напишите программу вывода на экран набора символов ASCII - кода.
2. Напишите программу, запрашивающую ввод имени, а затем отображающую в
средине экрана введенное имя.
Лабораторная работа № 4
Изучение команд обработки строк
Цель работы: Объяснить назначение специальных цепочечных команд,
используемых для обработки специальных символьных данных.
Общие сведения.
Для обработки строковых данных ассемблер имеет пять команд обработки
строк:
MOVS - переслать один байт или одно слово из одной области памяти в
другую;
LODS - загрузить из памяти один байт в регистр AL или одно слово в
регистр АХ;
STOS - записать содержимое регистра AL или АХ в память;
CMPS - сравнить содержимое двух областей памяти размером в один байт
или в одно слово;
SCAS - сравнить содержимое регистра AL или АХ с содержимым памяти.
Префикс REP позволяет этим командам обрабатывать строки любой длины.
Префикс кодируется непосредственно перед цепочечной командой, например REP
MOVS В. Для использования префикса REP необходимо установить начальное
значение в регистре СХ. При выполнении цепочечной команды с префиксом REP
происходит уменьшение на одно значение в регистре СХ до 0. Таким образом,
можно обрабатывать строки любой длины. В следующем примере выполняется
пересылка 20 байт из STRING1 в STRING2. Предположим, что оба регистра DS и
ES инициализированы адресом сегмента данных:
STRING1 DB 20DUP('*')
STRING2 DB 20DUP (")
……
CLD ; сброс файла DF
MOV СХ, 20 ; счетчик на 20 байт
LEA DI, STRING2 ; адрес "куда"
LEA SI, STRING1 ; адрес "откуда"
REP MOVSB ; переслать данные
Для команды LODS адрес памяти определяется регистрами DS:SI. В
зависимости от значения флага DF происходит увеличение или уменьшение
значения в регистре SI. Поскольку одна команда STOS также увеличивает или
уменьшает адрес в регистре DI на 1 для байта или на два для слова.
Практическая польза команды STOS с префиксом REP- инициализация области
данных конкретным значением. Длина области (в байтах или словах )
загружается в регистр СХ. Команда CMPS сравнивает содержимое одной области
памяти ( адресуемой регистрами DS : SI ) с содержимым другой области (
адресуемой регистрами ES : DI ). В зависимости от флага DF команда CMPS
также увеличивает или уменьшает адреса в регистрах SI и DI на 1 для байта
или на два для слова. При использовании префикса REP в регистре СХ должно
находится значение длины сравниваемых полей. Команда CMPS может сравнивать
любое число байтов или слов.
Рассмотрим процесс сравнения двух строк содержащих их имена Jean и
JOAN. Сравнение побайтово слева направо приводит к следующему
J : J равно
Е : 0 не равно ( Е<0 )
А : А равно
N : N равно
Сравнение всех четырех байтов заканчивается сравнением N:N -
равно/нуль. Так как имена " не равны ", операция должна прекратиться, как
только будет обнаружено условие " не равно". Для этих целей команда REP
имеет модификацию. REPE, которая повторяет сравнение до тех пор, пока
сравниваемые элементы равны или регистр СХ не равен нулю. Кодируется
повторяющееся однобайтное сравнение следующим образом :
REPE CMPSB.
Команда SCAS отличается от команды CMPS тем, что сканирует строку на
определенное значение байта или слова. Команда SCAS сравнивает содержимое
области памяти (адресуемой регистрами ES:DI ) с содержимым регистра AL или
АХ. В зависимости от значения флага DF команда SCAS также увеличивает или
уменьшает адрес в регистре DI на 1 для байта или на 2 для слова. При
использовании префикса REP и значения длины в регистре СХ команды SCAS
может сканировать строки другой длины. Команда SCAS особенно полезна в
текстовых редакторах, где программа должна сканировать строки, выполняя
поиск знаков пунктуации. Так как команда SCAS В должна продолжать
сканирование до тех пор, пока результат сканирования "не равно" или регистр
СХ не равен нулю, то используется префикс REPNE:
REPNE SCAS В.
Содержание задания:
1.Замените в строке STRING символ & на символ пробела
STRLEN EQIU 15: длина поля STRING
STRING DB ‘THE TIVE & IS NOW’
2. Имеются следующие определения:
DATASG SEGMENT PARA
CONAME DB 'SPASE EXPLORES INS'
PRLINE DB20DUP(")
Используя команды обработки строк, выполнить:
а) пересылку данных из CONAME в PRLINE слева направо;
б) пересылку данных из CONAME в PRLINE справа налево;
в) загрузку третьего и четвертого байтов области CONAME в регистр
АХ;
г) сохранение содержимого регистра АХ в области по адресу PRLINE
+5;
д) сравнение данных в области CONAME и PRLINE;
е) сканирование области CONAME и поиск в ней символа " пробел ".
Если символ будет найден, то переслать его в регистр ВН.
Лабораторная работа № 5
Изучение обработки двоичных данных, данных в форматах ASCII и BCD, таблиц.
Цель работы: Дать сведения об операциях сложения, вычитания, умножения
и деления двоичных чисел, рассмотреть ASCII и BCD - форматы данных и дать
сведения между этими форматами и двоичным форматом. Раскрыть требования для
определения таблиц, организации поиска в таблице в таблицах и сортировки
элементов таблицы.
Общие сведения.
Несмотря на то, что мы привыкли к десятичной арифметике, компьютер
работает только с двоичной арифметикой. Команды ADD и SUB выполняют
сложение и вычитание байтов или слов, содержащих двоичные данные. Вычитание
осуществляется в компьютере по методу сложения с двоичным дополнением:
для второго операнда устанавливаются обратные значения битов и
прибавляется 1, а затем происходит сложение с первым операндом.
Операция умножения для без знаковых данных выполняется командой MUL, a
знаковых - IMUL. Существуют две основные операции умножения, умножение
байта на байт. Множимое находится в регистре AL, а множитель в байте памяти
или в однобайтовом регистре. После умножения произведение находится в
регистре АХ.
Умножение слова на слово. Множимое находится в регистре АХ, а множитель
- в слове памяти или в регистре. После умножения произведение образуется в
двойном слове, левая часть произведения - в регистре DX, правая часть - в
регистре АХ. В единственном операнде команд MUL и INMUL указывается
множитель.
Операция деления для без знаковых данных выполняется командой DIV, а
знаковых - INDIV. Существуют две основные операции деления:
Деление слова на байт. Делимое находится в регистре АХ, а делитель в
байте памяти или однобайтном регистре. Для деления остаток получается в
регистре АН, а частное - в AL.
Деление двойного слова на слово. Делимое находится в регистровой паре
DX:AX, а делитель - в слове памяти или в регистре. После деления остаток
получается в регистре DX, а частное в регистре - АХ.
Данные, вводимые с клавиатуры, имеют ASCII - формат, например, буквы
SAM имеют в памяти шестнадцатеричное представление 53414DH. С помощью
следующих ассемблерных команд можно выполнять арифметические операции
непосредственно над числами в ASSCII - формате:
ААА - коррекция для сложения ASCII кода;
AAD - коррекция для деления ASCII кода;
ААМ - коррекция для умножения ASCII кода;
AAS - коррекция для вычитания ASCII кода.
Эти команды кодируются без операндов и выполняют автоматическую
коррекцию в регистре АХ. Коррекция необходима, так как ASCII – код
представляет так называемый распакованный десятичный формат, в то время как
компьютер выполняет арифметические операции в двоичном формате.
Например, сложение и коррекция кодируются следующими командами:
ADD AL, BL ; сложить числа в регистрах AL и-BL
ААА ; коррекция для сложения ASCII- кодов.
Если сжать число в ASCII - формате, сохраняя только правые цифры
каждого байта, то получим BCD - формат (двоично - десятичный формат). Можно
выполнять сложение и вычитание в BCD - формате. Для этого служат две
корректирующие команды:
DAA - десятичная коррекция для сложения;
DAS - десятичная коррекция для вычитания.
Во многих прикладных программах используется табличная организация
данных, например, имена, описания, размеры. Определение и использование
таблиц включает одну новую команду ассемблера XLAT. Таким образом
использование таблиц - это дело техники и применение знаний, полученных
ранее. Для облегчения табличного поиска большинство таблиц определяются
систематично, т.е. элементы таблиц имеют одинаковый формат, одинаковую
длину и восходящую или нисходящую последовательность элементов. Пример
описания таблицы:
MONTAB DB 'JAN', 'FEB', 'MAR', ..., 'DEC'.
Команда XLAT транслирует содержимое одного байта в другое
предопределенное значение. С помощью команды XLAT можно проверить
корректность содержимого элементов данных. Команда XLAT предполагает адрес
таблицы в регистре ВХ, а транслируемый байт (например, поля ASCHO) - в
регистре AL. Следующие команды выполняют подготовку и трансляцию байта:
LEA ВХ, XLTBL
MOV AL, ASCHO
XLAT.
Команда XLAT использует значение в регистре AL в качестве
относительного адреса в таблице, т.е. складывает адрес в ВХ и смещение в
AL.
Содержание задания
1. Имеются следующие данные:
DATAX DW 0148H
DW 2316H
DATAY DW 0237H
DW 4052H
Закодируйте команды для сложения:
а) слово DATAX со словом DATAY;
б) двойного слова, начинающегося по адресу DATAX , на слово DATAY.
2. Поле UNPAK содержит 01040705 в распакованном десятичном формате.
Напишите цикл, который преобразует это содержимое в ASCII - формат,
т.е. 31343735.
3. Поле ASCA содержит значение 313733 в ASCII - формате, а другое поле
ASCB содержит 35. Напишите программу, перемножающую эти числа в ASCII -
формате и записывающую произведение в поле ASCPRO.
4. Определите 3 отдельные связанные таблицы, содержащие следующие
данные:
а) числовые элементы - 06,10,14,21,24;
б) элементы наименований - видеокассеты, приемники, модемы,
клавиатура, дискеты;
в) цены - 93.95, 82.25, 90.67, 85.80, 13.85.
Составьте программу, позволяющую вводить числовой элемент (ITEMIN) и
количество (QTYIN) с клавиатуры. Разработайте программу табличного поиска
элемента, равного ITEMIN. Выделите из таблиц наименование и цену.
Рассчитайте стоимость (количество х цена) и выведите на экран наименование
и стоимость.
Лабораторная работа № 6
Изучение свойств дисковой памяти
Цель работы: изучить основные требования к программированию функций DOS
для обработки дисковых файлов; функций BIOS для записи и чтения дисковых
файлов.
Общие сведения.
Обработка дисковых файлов в базовой DOS включает определение блока
управления файлом (FCB - FILE CONTROL BLOCK), который описывает файл и его
записи. Передача адреса блока FCB в DOS обязательна для всех дисковых
операций ввода - вывода. Для выполнения операций ввода - вывода на диске в
DOS необходимо определить блок FCB в области данных, который используется
главным образом для обработки файлов в текущем каталоге. Блок FCB содержит
описание файла и его записей в приведенном ниже формате. Пользователь
должен инициализировать байты 0... 15 и 32...36, байты 16...31
устанавливаются DOS:
Байты назначение
0 Указывает дисковод: Код 01 - для дисковода А;
02- для В и т.д.
1...8 Имя файла
9...11 Тип файла для дополнительной идентификации
12...13 Номер текущего блока
14...15 Логический размер записи
16...19 Размер файла
20...21 Дата
22...31 Зарезервировано для DOS
32 Текущий номер записи в текущем блоке
33...36 Относительный номер записи
Для ссылки на каждый дисковый файл программа должна содержать правильно
составленный блок управления файлом. Операции ввода - вывода на диск
требуют установки адреса блока FCB в регистре DX. Доступ к полям блока FCB
осуществляется по этому адресу с помощью регистровой пары DS:DX. Для
создания нового файла программа использует функцию 16Н в прерывании DOS INT
21H следующим образом:
MOV АН, 16Н ; создание
LEA DX, FCBNAME ; дискового файла
INT 21H ; вызов DOS
Система DOS осуществляет поиск по имени и типу файла, взятых из
соответствующих полей FCB в оглавлении. Если элемент оглавления, содержащий
необходимое имя (и тип) будет найден, то DOS очищает найденный элемент для
нового использования, если такой элемент не будет найден, то DOS ищет
свободный элемент. Затем операция устанавливает размер файла в 0 и
открывает файл. На этапе открытия происходит проверка доступного дискового
пространства, результат проверки устанавливается в регистре AL:
00 на диске есть свободное пространство
FF на диске нет свободного пространства
Аналогичным образом программа использует в прерывании
DOS INT 21H следующие функции:
15Н - Для последовательной записи на диск;
10Н - Для закрытия файла;
OFH - Открытие файла;
14Н - Для последовательного чтения записей с диска;
21H - Для прямого чтения записи;
22Н - Для прямой записи;
11Н и 12Н - Поиск элементов оглавления;
13Н - Удаление файла;
17Н - Переименование файла;
0ЕН - Установка текущего дисковода
Для определения выводной записи необходимо прежде всего указать
начальный адрес области передачи данных (DTA - DISK TRANSFER AREA). Затем с
помощью функции 1АН необходимо сообщить DOS адрес DTA. Активным может быть
только один DTA.
MOV АН, 1АН ; установка адреса
LEA DX, DTANAME ; DTA
INT 21H ; вызов DOS
Дисковые операции можно программировать непосредственно на уровне BIOS.
Дисковая операция BIOS INT 13H рассматривает все записи, как имеющие размер
сектора, а адресацию диска осуществляет в терминах действительных номеров
дорожки и сектора. Для дисковых операций чтzения, записи и верификации
необходима инициализация следующих регистров:
АН - тип операции: чтение, запись, верификация или форматирование;
AL - число секторов;
СН- номер дорожки;
CL - номер головного сектора;
DH - номер головки (стороны): 0 или 1 для дискеты ;
DL - номер дисковода: 0=А, 1=В и т. д.
ES: ВХ- адрес буфера ввода- вывода в области данных.
Для указания необходимой дисковой операции необходимо перед INT 13H
загрузить в регистр АН соответствующий код.
АН=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.