ФГБОУ ВО Уфимский государственный авиационный технический университет
Кафедра АСУ
100 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
90 |
|
|
|
|
|
|
|
|
|
|
|
|
80 |
|
|
|
|
|
|
|
|
|
|
|
|
70 |
|
|
|
|
|
|
|
|
|
|
|
|
60 |
|
|
|
|
|
|
|
|
|
|
|
|
50 |
|
|
|
|
|
|
|
|
|
|
|
|
40 |
|
|
|
|
|
|
|
|
|
|
|
|
30 |
|
|
|
|
|
|
|
|
|
|
|
|
20 |
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
К расчетно-графической работе
по дисциплине «Системное программное обеспечение»
НИЗКОУРОВНЕВОЕ СИСТЕМНОЕ
ПРОГРАММИРОВАНИЕ
ДЛЯ IBM PC
Вариант 2.1.1.1.1.
Группа ИВТ-414 |
Фамилия И.О. |
Подпись |
Дата |
Оценка |
Студент |
Балыбердин Н.А. |
|
|
|
Консультант |
Лянцев О.Д. |
|
|
|
Принял |
Лянцев О.Д. |
|
|
|
Уфа 2020 г.
Федеральное агентство по образования
Государственное образовательное учреждение высшего профессионального образования
«Уфимский государственный авиационный технический университет»
Кафедра Автоматизации систем управления
ЗАДАНИЕ
на РГР проект по дисциплине «Системное программное обеспечение»
Студент_Балыбердин Н.А. Группа__ИВТ-414 ___ Консультант___Лянцев О.Д.____
ФИО № акад. гр. ФИО
-
Тема курсовой работы (наименование темы)
Разработка программы с помощью низкоуровневых средств на |
языке ассемблера |
-
Основное содержание:
Вариант 2: вывести на экран содержимое текстового файла |
FILE_SPO.txt (размером не более 80 байтов) синими символами на |
желтом фоне |
-
Требования к оформлению:
-
Пояснительная записка должна быть оформлена в редакторе Microsoft ®Word в соответствии с требованиями ___________ЕСКД,ЕСПД_________________________
-
ЕСКД, ЕСПД, ГОСТ и др.
-
В пояснительной записке должны содержаться следующие разделы:
Титульный лист, задание, введение, обоснование выбора |
низкоуровневых функций, текст программы с |
комментариями, примеры выполнения программы, заключение |
|
-
Графическая часть должна содержать:
Примеры выполнения программы |
|
|
Дата выдачи «___»__________20__г. Дата окончания «__»_______20__г.
Руководитель____________________
подпись
Содержани
Введение 4
Цель: 5
Задание: 5
Выбор системных функций и разработка алгоритма 6
Текст программы 8
Скриншоты программы 11
Заключение 11
Литература 12
Введение 3
Цель: 5
Задание: 5
Выбор системных функций и разработка алгоритма 6
Текст программы 8
Скриншоты программы 10
Заключение 11
Литература 12
Введение
Распространение микрокомпьютеров послужило причиной пересмотра отношения к языку ассемблера по двум основным причинам. Во-первых, программы, написанные на языке ассемблера, требуют значительно меньше памяти и времени выполнения.
Во-вторых, знание языка ассемблера и результирующего машинного кода дает понимание архитектуры машины, что вряд ли обеспечивается при работе на языке высокого уровня. Хотя большинство специалистов в области программного обеспечения ведут разработки на языках высокого уровня, таких как Паскаль или С, что проще при написании программ, наиболее мощное и эффективное программное обеспечение полностью или частично написано на языке ассемблера.
Языки высокого уровня были разработаны для того, чтобы избежать специальной технической особенности конкретных компьютеров. Язык ассемблера, в свою очередь, разработан для конкретной специфики компьютера или точнее для специфики процессора. Следовательно, для того, чтобы написать программу на языке ассемблера для конкретного компьютера, следует знать его архитектуру.
Язык ассемблера помогает раскрыть все секреты аппаратного и программного обеспечения. С его помощью можно получить представление о том, как аппаратная часть взаимодействует с операционной системой и как прикладные программы обращаются к операционной системе. Большинство программистов работают с языками высокого уровня, где отдельное утверждение преобразовывается во множество процессорных команд. Ассемблер язык машинного уровня; каждая команда непосредственно интерпретируется в машинный код, что дает основание считать его языком низкого уровня. Наиболее часто язык ассемблера используется для написания дополнений к операционной системе или для написания программ прямого доступа к аппаратуре. Он необходим также при оптимизации критических блоков в прикладных программах с целью повышения их быстродействия.
Написание ассемблерных программ требует знаний организации всей системы компьютера. Машинная программа представляет собой последовательность команд, которые «объясняют» компьютеру, что он должен делать. Но машинный язык труден для понимания людей – программистов.
Язык ассемблера, сохраняя все значения машинного языка, в то же время более понятен и удобен программисту. Компьютер «читает» программы на языке ассемблера и переводит их в машинный код, «ассемблирует» программу. Таким образом, операцию перевода с языка ассемблера на машинный выполняет программа, называемая ассемблером.
Язык ассемблера, в отличие от языков программирования высокого уровня, является машинно-зависимым, языком низкого уровня. По этой причине программа, написанная на ассемблере, должна отражать все особенности архитектуры микропроцессора: организацию памяти, способы адресации операндов, правила использования регистров и т. д. Из-за необходимости учёта подобных особенностей ассемблер уникален для каждого типа микропроцессоров.
Цель:
Целью выполнения расчётно-графической работы по дисциплине «Системное программное обеспечение» является формирование у студентов опыта создания прикладных программ на основе низкоуровневых системных функций BIOS и MS DOS.
Задание:
а) вывести на экран содержимое текстового файла FILE_SPO.txt (размером не более 80 байтов) синими символами на желтом фоне;
б) формат программы: com-программа;
в) ввод с клавиатуры: средствами DOS;
г) вывод на экран: в текстовом режиме;
д) динамическое распределение памяти: определение размера программы.
Выбор системных функций и разработка алгоритма
Рассмотрим работу в текстовом режиме. Вся работа программы осуществляется в стандартном текстовом режиме 80 символов на 25 строк.
Когда дисплей установлен в текстовый режим, то каждой позиции символа на экране отводится два байта памяти. Первый байт содержит номер кода ASCII кода символа, а второй — атрибуты символа. Цветной адаптер может выводить в цвете, как сам символ, так и всю область, отведенную данному символу (фоновый цвет).
Также рассмотрим структуру com-файла и определим функции ввода и вывода.
Программа типа .com содержит лишь один сегмент, включающий все компоненты программы: PSP (префикс программного сегмента — это область размером 100h байт, которая содержит информацию необходимую DOS для работы программы), программный код (т.е. оттранслированные в машинные коды программные строки), данные и стек. После загрузки программы все сегментные регистры (CS, DS, ES, SS) указывают на начало PSP. Указатель стека инициализируется числом FFFEh. Отсюда следует, что, независимо от фактического размера программы ей выделяется 64 Кбайт адресного пространства, всю нижнюю часть которой занимает стек.
Первое слово PSP содержит номер прерывания DOS, которое будет приводить к завершению программы. Когда выполняется последний оператор RET программы, то значения на вершине стека указывают счетчику команд (регистр IP) на начало PSP, таким образом, код завершения выполняется как следующая инструкция программы.
mov ah,13h — функция вывода строки
mov ah,2Ch — функция DOS определить время,
mov ah,0 — функция считывания кода нажатой клавиши
mov ah,04Ch — функция DOS завершения программы. Используется для выхода из программы.
Блок схема алгоритма
Текст программы
TITLE RGR_VAR2
.MODEL SMALL
.CODE
ORG 100H
Begin:
lea dx,Header ;загружаем адрес строки заголовка
call Show ;функция вывода
lea dx,FileString ;адрес строки с сообщением об имени файла
call Show ;Функция вывода строки на экран
lea dx,PressContinue ;адрес строки с сообщением о продолжении
call Show
MOV AH,10H ;ожидание нажатия кнопки
INT 16H
lea dx,FileName ;загружаем в dx адрес с именем файла
call OtkrFile ;получаем дескриптор файла через функцию
jc Error ;проверить флаг на ошибку открытия файла(файл отсутствует)
mov bx,ax ;сохраняем дескриптор файла в bx
lea dx,Buffer ;записываем адрес буфера в dx
mov cx,1 ;сколько байт(символов) читать. Будем читать по одному символу
Read:
mov ah,3fh ;функция считывания из файла
int 21h ;сервис dos
inc dx ;сдвинем адрес записи на ячейку
cmp ax, 0 ;в ax будет 0, если достигнут конец файла
jc Error ;проверить флаг на ошибку
jne Read ;если не конец файла, читаем дальше
dec dx ;уменьшим адрес записи на 1. Чтобы избежать вывода лишнего символа
mov ax,dx ;сохраняем конечный адрес строки в ax
lea dx,Buffer ;берем начальный адрес строки
sub ax,dx ;Вычитаем из адреса конца строки адрес начала. Тем самым находим размер строки
push ax ;сохраним количество символов для вывода в стеке
Call ZakrFile ;функция закрытие файла
mov ah,03 ;функция определения позции курсора. Координаты записываются в DX
mov bh,0 ;страница 0
int 10h ;вызвать BIOS
pop cx ;возвращаем количество символов для вывода из стека в cx. Будем использовать его для следующей функции
mov ah,13h ;функция вывода строки
mov al,1 ;использовать атрибут и переместить курсор
mov bh,0 ;0 страница
mov bl,0E9h ;Ярко синий текст на желтом фоне
lea bp,Buffer ;адрес считывания
;положение курсора получено ранее в DX. Количество символов для вывода в CX
int 10h ;выполняем
jmp Exit
Error:
lea dx, ErrStr ;загружаем в dx адрес строки с сообщением об ошибке
call Show
Exit:
MOV AH,10H ;ожидание нажатия кнопки
INT 16H
mov ah,04Ch ;функция DOS выхода из пpогpаммы
mov al,0h ;код возвpата
int 21h
OtkrFile PROC ;Функция открытия файла
mov ah,3dh ;функция открытия файла
mov al,0 ;0 - открыть для чтения 1 - запись 2 - чтение,запись
int 21h ;сервис dos
ret ;возврат
OtkrFile ENDP
ZakrFile PROC ;функция закрытия файла
mov ah,3eh ;функция закрытия файла
int 21h ;сервис dos
ret
ZakrFile ENDP
Show PROC ;функция вывода
mov ah,09 ;функция вывода строки на экран
int 21h ;dos
ret
Show ENDP
FileString DB 'Filename: '
FileName DB 'FILE_SPO.txt',0,10,13,'$'
ErrStr DB 'Ошибка работы с файлом. Возможно, файл отсутствует.',10,13,'$'
Header DB 'Расчетно-графическая работа',10,13,'<<Системное программное обеспечение>>',10,13,'Студента группы ИВТ-314',10,13,'Балыбердин Н.А.',10,13,'Вариант 2',10,10,13,'$'
PressContinue DB 'Press any key to continue...',10,10,13,'$'
Buffer DB ?
End Begin