ФГБОУ ВО Уфимский государственный авиационный технический университет
Кафедра АСУ
100 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
90 |
|
|
|
|
|
|
|
|
|
|
|
|
80 |
|
|
|
|
|
|
|
|
|
|
|
|
70 |
|
|
|
|
|
|
|
|
|
|
|
|
60 |
|
|
|
|
|
|
|
|
|
|
|
|
50 |
|
|
|
|
|
|
|
|
|
|
|
|
40 |
|
|
|
|
|
|
|
|
|
|
|
|
30 |
|
|
|
|
|
|
|
|
|
|
|
|
20 |
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
К расчетно-графической работе
по дисциплине «Системное программное обеспечение»
НИЗКОУРОВНЕВОЕ СИСТЕМНОЕ
ПРОГРАММИРОВАНИЕ
ДЛЯ IBM PC
Вариант 4.1.1.1.1.
Группа ИВТ-314 |
Фамилия И.О. |
Подпись |
Дата |
Оценка |
Студент |
Билалов Р.И. |
|
|
|
Консультант |
Лянцев О.Д. |
|
|
|
Принял |
Лянцев О.Д. |
|
|
|
Уфа 2019 г.
Федеральное агентство по образования
Государственное образовательное учреждение высшего профессионального образования
«Уфимский государственный авиационный технический университет»
Кафедра Автоматизации систем управления
ЗАДАНИЕ
на РГР проект по дисциплине «Системное программное обеспечение»
Студент_Билалов Р.И.. Группа__ИВТ-314 ___ Консультант___Лянцев О.Д.____
ФИО № акад. гр. ФИО
-
Тема курсовой работы (наименование темы)
Разработка программы с помощью низкоуровневых средств на |
языке ассемблера |
-
Основное содержание:
Вариант 4: Изменить дату и время создания файла MYFILE.txt и вывести их |
старые и новые значения на экран |
|
-
Требования к оформлению:
-
Пояснительная записка должна быть оформлена в редакторе Microsoft ®Word в соответствии с требованиями ___________ЕСКД,ЕСПД_________________________
-
ЕСКД, ЕСПД, ГОСТ и др.
-
В пояснительной записке должны содержаться следующие разделы:
Титульный лист, задание, введение, обоснование выбора |
низкоуровневых функций, текст программы с |
комментариями, примеры выполнения программы, заключение |
|
-
Графическая часть должна содержать:
Примеры выполнения программы |
|
|
Дата выдачи «___»__________20__г. Дата окончания «__»_______20__г.
Руководитель____________________
подпись
Содержани
Введение 4
Цель: 5
Задание: 5
Выбор системных функций и разработка алгоритма 6
Текст программы 9
Скриншоты программы 18
19
Заключение 19
Литература 20
Введение 4
Цель 5
Задание 5
Выбор системных функций и разработка алгоритма 6
Блок-схема программы 7
Текст программы с необходимыми комментариями 8
Скриншоты программы 17
Заключение 18
Литература 19
Введение
Распространение микрокомпьютеров послужило причиной пеpесмотра отношения к языку ассемблера по двум основным причинам. Во-первых, программы, написанные на языке ассемблера, требуют значительно меньше памяти и времени выполнения.
Во-вторых, знание языка ассемблера и результирующего машинного кода дает понимание архитектуры машины, что вряд ли обеспечивается при работе на языке высокого уровня. Хотя большинство специалистов в области программного обеспечения ведут разработки на языках высокого уровня, таких как Паскаль или С, что проще при написании программ, наиболее мощное и эффективное программное обеспечение полностью или частично написано на языке ассемблера.
Языки высокого уровня были разработаны для того, чтобы избежать специальной технической особенности конкретных компьютеров. Язык ассемблера, в свою очередь, разработан для конкретной специфики компьютера или точнее для специфики процессора. Следовательно, для того, чтобы написать программу на языке ассемблера для конкретного компьютера, следует знать его архитектуру.
Язык ассемблера помогает раскрыть все секреты аппаратного и программного обеспечения. С его помощью можно получить представление о том, как аппаратная часть взаимодействует с операционной системой и как прикладные программы обращаются к операционной системе. Большинство программистов работают с языками высокого уровня, где отдельное утверждение преобразовывается во множество процессорных команд. Ассемблер """" язык машинного уровня; каждая команда непосредственно интерпретируется в машинный код, что дает основание считать его языком низкого уровня. Наиболее часто язык ассемблера используется для написания дополнений к операционной системе или для написания программ прямого доступа к аппаратуре. Он необходим также при оптимизации критических блоков в прикладных программах с целью повышения их быстродействия.
Написание ассемблерных программ требует знаний организации всей системы компьютера. Машинная программа представляет собой последовательность команд, которые «объясняют» компьютеру, что он должен делать. Но машинный язык труден для понимания людей – программистов.
Язык ассемблера, сохраняя все значения машинного языка, в то же время более понятен и удобен программисту. Компьютер «читает» программы на языке ассемблера и переводит их в машинный код, «ассемблирует» программу. Таким образом, операцию перевода с языка ассемблера на машинный выполняет программа, называемая ассемблером.
Язык ассемблера, в отличие от языков программирования высокого уровня, является машинозависимым, языком низкого уровня. По этой причине программа, написанная на ассемблере, должна отражать все особенности архитектуры микропроцессора: организацию памяти, способы адресации операндов, правила использования регистров и т. д. Из-за необходимости учёта подобных особенностей ассемблер уникален для каждого типа микропроцессоров.
Цель:
Целью выполнения расчётно-графической работы по дисциплине «Системное программное обеспечение» является формирование у студентов опыта создания прикладных программ на основе низкоуровневых системных функций BIOS и MS DOS.
Задание:
а) изменить дату и время создания файла MYFILE.txt и вывести их старые и новые значения на экран;
б) формат программы: 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 PROG
.MODEL tiny
.data
Header DB 'Calculation and graphic work',10,13,'System software',10,13,'Student of group IVT-314',10,13,'Bilalov R.I.',10,13,'Variant 4',10,10,13,'$'
filename DB 'c:\MYFILE.txt',0
Error db 13,10,'Error!',13,10,'$'
MessageOld db 'Old $'
MessageNew db 0dh,0ah,'New $'
MessageDateTime db 'data: '
day_pos db 'xx.'
month_pos db 'xx.'
year_pos db 'xxxx, time:'
hours_pos db 'xx:'
minutes_pos db 'xx:'
seconds_pos db 'xx',0dh,0ah,'$'
MessageEnterDate db 'Enter date (dd.mm.yyyy): $'
MessageEnterTime db 0dh,0ah,'Enter time (hh:mm:ss): $'
InBuffer db 128
InCount db ?
InData db 128 dup (?)
progSize db 'Program size: '
SizeP db ' ',' bytes',10,10,13,'$'
FINISH label byte
.CODE
.186
ORG 100H
BEGIN:
lea dx,Header
mov ah,09
int 21h
mov ax, ((FINISH_PRG-BEGIN+1) and 0fffeh)+FINISH-filename
lea si,SizeP+3
mov cx,10
Repeat:
mov dx,0
div cx
add dl,'0'
mov byte ptr [si], dl
dec si
cmp ax,0
jne Repeat
lea dx,progSize
mov ah,09
int 21h
mov ah, 3dh
mov al, 0
lea dx, filename
int 21h
jc MError
mov bx, ax
mov ax, 5700h ;read time/date of file
int 21h
lea si, MessageOld
;call PrintTimeDate
push dx
mov dx, si
mov ah, 9
int 21h
pop dx
push dx
push cx
mov ax, dx
and ax, 001fh
aam
or ax, '00'
mov day_pos, ah
mov day_pos+1, al
mov ax, dx
and ax, 01e0h
shr ax, 5
aam
or ax, '00'
mov month_pos, ah
mov month_pos+1, al
mov ax, dx
shr ax, 9
add ax, 1980
mov cl, 100
div cl
push ax
aam
or ax, '00'
mov year_pos, ah
mov year_pos+1, al
pop ax
mov al, ah
aam
or ax, '00'
mov year_pos+2, ah
mov year_pos+3, al
pop cx
mov ax, cx
shr ax, 11
aam
or ax, '00'
mov hours_pos, ah
mov hours_pos+1, al
mov ax, cx
and ax, 07e0h
shr ax, 5
aam
or ax, '00'
mov minutes_pos, ah
mov minutes_pos+1, al
mov al, cl
and al, 1fh
shl al, 1
aam
or ax, '00'
mov seconds_pos, ah
mov seconds_pos+1, al
lea dx, MessageDateTime
mov ah, 9
int 21h
pop dx
;end PrintTimeDate
;call EnterNewTimeDate
lea dx, MessageEnterDate
mov ah, 9
int 21h
lea dx, InBuffer
mov ah, 0ah
int 21h
cmp byte ptr InCount, 10
jne EnterNewTimeDate_error
lea si, InData
;call GetNum2
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and al, 0fh
mov ah, 10
mul ah
mov dx, ax
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and ax, 0fh
add ax, dx
clc
;end GetNum2
jc EnterNewTimeDate_error
cmp ax, 31
jg EnterNewTimeDate_error
test ax, ax
jz EnterNewTimeDate_error
mov di, ax
lea si, InData+3
;call GetNum2
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and al, 0fh
mov ah, 10
mul ah
mov dx, ax
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and ax, 0fh
add ax, dx
clc
;end GetNum2
jc EnterNewTimeDate_error
cmp ax, 12
jg EnterNewTimeDate_error
test ax, ax
je EnterNewTimeDate_error
shl ax, 5
or di, ax
lea si, InData+6
;call GetNum 4
;call GetNum 2
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and al, 0fh
mov ah, 10
mul ah
mov dx, ax
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and ax, 0fh
add ax, dx
clc
;end GetNum2
jc GetNum4_ret
mov bp, 100
mul bp
push ax
;call GetNum2
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and al, 0fh
mov ah, 10
mul ah
mov dx, ax
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and ax, 0fh
add ax, dx
clc
;end GetNum2
pop bp
jc GetNum4_ret
add ax, bp
clc
;end GetNum4
jc EnterNewTimeDate_error
sub ax, 1980
jl EnterNewTimeDate_error
cmp ax, 119
jg EnterNewTimeDate_error
shl ax, 9
or di, ax
lea dx, MessageEnterTime
mov ah, 9
int 21h
lea dx, InBuffer
mov ah, 0ah
int 21h
cmp byte ptr InCount, 8
jne EnterNewTimeDate_error
lea si, InData
;call GetNum2
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and al, 0fh
mov ah, 10
mul ah
mov dx, ax
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and ax, 0fh
add ax, dx
clc
;endGetNum2
jc EnterNewTimeDate_error
cmp ax, 23
jg EnterNewTimeDate_error
shl ax, 11
mov cx, ax
lea si, InData+3
;callGetNum2
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and al, 0fh
mov ah, 10
mul ah
mov dx, ax
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and ax, 0fh
add ax, dx
clc
;end GetNum2
jc EnterNewTimeDate_error
cmp ax, 59
jg EnterNewTimeDate_error
shl ax, 5
or cx, ax
lea si, InData+6
;call GetNum2
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and al, 0fh
mov ah, 10
mul ah
mov dx, ax
lodsb
cmp al, '0'
jl GetNum2_error
cmp al, '9'
jg GetNum2_error
and ax, 0fh
add ax, dx
clc
;end GetNum2
jc EnterNewTimeDate_error
cmp ax, 59
jg EnterNewTimeDate_error
shr ax, 1
or cx, ax
mov dx, di
clc
;end EnterNewTimeDate
jc MError
mov ax, 5701h
int 21h
lea si, MessageNew
;call PrintTimeDate
push dx
mov dx, si
mov ah, 9
int 21h
pop dx
push dx
push cx
mov ax, dx
and ax, 001fh
aam
or ax, '00'
mov day_pos, ah
mov day_pos+1, al
mov ax, dx
and ax, 01e0h
shr ax, 5
aam
or ax, '00'
mov month_pos, ah
mov month_pos+1, al
mov ax, dx
shr ax, 9
add ax, 1980
mov cl, 100
div cl
push ax
aam
or ax, '00'
mov year_pos, ah
mov year_pos+1, al
pop ax
mov al, ah
aam
or ax, '00'
mov year_pos+2, ah
mov year_pos+3, al
pop cx
mov ax, cx
shr ax, 11
aam
or ax, '00'
mov hours_pos, ah
mov hours_pos+1, al
mov ax, cx
and ax, 07e0h
shr ax, 5
aam
or ax, '00'
mov minutes_pos, ah
mov minutes_pos+1, al
mov al, cl
and al, 1fh
shl al, 1
aam
or ax, '00'
mov seconds_pos, ah
mov seconds_pos+1, al
lea dx, MessageDateTime
mov ah, 9
int 21h
pop dx
;end PrintTimeDate
mov ah, 3eh
int 21h
;jnc NoError
MError:
lea dx, Error
mov ah,09h
int 21h
NoError:
mov ax,4c00h
int 21h
EnterNewTimeDate_error:
stc
ret
GetNum4_ret:
ret
GetNum2_error:
stc
ret
FINISH_PRG:
END BEGIN