Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
RGRSPOOtchet.docx
Скачиваний:
2
Добавлен:
05.09.2020
Размер:
174 Кб
Скачать

ФГБОУ ВО Уфимский государственный авиационный технический университет

Кафедра АСУ

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 ___ Консультант___Лянцев О.Д.____

ФИО № акад. гр. ФИО

  1. Тема курсовой работы (наименование темы)

Разработка программы с помощью низкоуровневых средств на

языке ассемблера

  1. Основное содержание:

Вариант 4: Изменить дату и время создания файла MYFILE.txt и вывести их

старые и новые значения на экран

  1. Требования к оформлению:

    1. Пояснительная записка должна быть оформлена в редакторе Microsoft ®Word в соответствии с требованиями ___________ЕСКД,ЕСПД_________________________

ЕСКД, ЕСПД, ГОСТ и др.

    1. В пояснительной записке должны содержаться следующие разделы:

Титульный лист, задание, введение, обоснование выбора

низкоуровневых функций, текст программы с

комментариями, примеры выполнения программы, заключение

    1. Графическая часть должна содержать:

Примеры выполнения программы

Дата выдачи «___»__________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

Соседние файлы в предмете Системное программное обеспечение