1   2   3   4   5   6
Ім'я файлу: 153_____ (2).doc
Розширення: doc
Розмір: 320кб.
Дата: 30.01.2020
скачати

3.Інструкція для користувача


Після запуску програми перед користувачем з’явиться наступне вікно.



Рис. 2.1. Меню програми

Для вибору одного із пунктів потрібно натиснути на клавішу яка відповідає номеру в меню.

Якщо натиснути клавішу «1» то програмка напише перед користувачем дані про автора програми.

При виклику команди «Print Statistic» програмка виведе перед користувачем кількість телефонів у каталозі, рік випуску найстарішого та наймолодшого, а також максимальну роздільну здатність камери (Рис. 2.2).



Рис. 2.2. Статистика

При виборі третього пункту меню ми маємо змогу переглядати характеристики телефонів які вже записані в файлі. А точніше, буде виведено характеристики першого телефону в файлі (Рис. 2.3.).



Рис. 2.3. Вивід характеристик

З допомогою клавіш «4», «6» можна переходити між сусідніми записами в файлі, але для більшої зручності в програмі передбачено пошук телефонів. Для цього необхідно вибрати п’ятий пункт меню.

Якщо при пошуку не було знайдено ні одного телефону введеної вами моделі то програма видасть повідомлення «Phone not found!». Якщо ж було знайдено телефон, то програма миттєво виведе його характеристики.

При виборі 7-го пункту ми маємо змогу добавити новий телефон у файл. Вводимо відповідні значення у поля і натискаємо «Enter».

Якщо додавання пройшло успішно то програма напише відповідне повідомлення. Для відміни додавання потрібно залиши поле «Name» пустим і натиснути «Enter» (Рис. 2.4.).



Рис. 2.4. Добавлення телефону

Також в програмі передбачено команду для видалення телефону із файлу. Для цього необхідно натиснути кнопку «8» при перегляді телефону який Ви плануєте видалити.

Для редагування запису необхідно натиснути «9». Після чого Вам необхідно набрати нові дані у відповідні поля. Якщо ж Ви не бажаєте редагувати то залишіть поле «Name» пустим та натисніть клавішу «Enter».


Рис. 2.5. Редагування телефону

Для виходу з програми натисніть клавішу «0». Після чого програма автоматично закриє всі файли які вона використовувала.

ВИСНОВКИ



СПИСОК ЛІТЕРАТУРИ


Assembler. Учебник для вузов. 1-е изд. / В. И. Юров — СПб.: Питер, 2003. — 37 с.: ил.

Ассемблер на примерах. Базовый курс./ Рудольф Марек. — СПб: Наука и Техника, 2005. — 240 с: ил.

Assembler. Учебник для вузов. 2-е изд. / В. И. Юров — СПб.: Питер, 2003. — 37 с.: ил.

Assembler. Язык неограниченных возможностей./ Зубков С.В. — СПб.: Издательство «ДМК Пресс», 1999.

ДОДАТКИ

Лістинг програми


.model small

.stack 100h

.code

START:

call Init ; Ініціалізація

call ShowMainMenu ; МЕНЮ ПРОГРАМИ

ReadUserAction:

mov al, 25

call CursorToLine ; Прячемо курсор в 25 рядку(який неіснує)

call ReadKeyProc ; Читаємо клавішу

sub AL, 30h

;перевірка натиснутої клавіші

cmp AL,0

jl ReadUserAction

cmp AL,9

jg ReadUserAction

call ClrPartScr

;-//- В залежності від вибору користувачем команди:::

cmp AL, 1

je ACTION_about ; 1- Вивід на екран "Про програму"
cmp AL, 2

je ACTION_stat ; 2- Вивід статистики

cmp AL, 3

je ACTION_print ; 3- Виводимо на екран список телефонів

cmp AL, 4

je ACTION_prev ; 4- Попередній запис

cmp AL, 5

je ACTION_view ; 4- Запис під індексом

cmp AL, 6

je ACTION_next ; 6- Наступний запис

cmp AL, 7

je ACTION_add ; 2- Форма добавлення нового телефону

cmp AL, 8

je ACTION_remove ; 3- Видалення телефону

cmp AL, 9

je ACTION_edit ; 4- Редагування даних про телефону

cmp AL, 0

je EXIT ; 0- Виходимо з програми

jmp ReadUserAction

;-//- ОБРОБКА КОМАНД

ACTION_about:

call About

jmp ReadUserAction

ACTION_stat:

call PrintStat

jmp ReadUserAction
ACTION_print:

call PrintPhones

jmp ReadUserAction

ACTION_prev:

call PrevPhone

jmp ReadUserAction

ACTION_view:

call ViewPhone

jmp ReadUserAction

ACTION_next:

call NextPhone

jmp ReadUserAction

ACTION_add:

call AddPhone

jmp ReadUserAction

ACTION_remove:

call RemovePhone

jmp ReadUserAction

ACTION_edit:

call EditPhone

jmp ReadUserAction

;-//-ВИХІД ІЗ ПРОГРАМИ

EXIT:

call Destr ; Деструктор
mov AX, 4C00h

INT 21h
include mp_if.asm ; Інтерфейс програми

include mp_func.asm ; Основні функції

end start

.data

;-//- Змінні для позначення початку/кінця програми

sProgramTitle db 22 dup(32),' ..... MOBILE PHONES .....',13,10

db 80 dup('_'),'$'

WIbuff db 80 dup(?)

;-//- Змінні для меню

sMenu db 20 dup(32),'| | -1- About this program | |',13,10 ; Про програму

db 20 dup(32),'| | -2- Print statistic | |',13,10 ; Статистика

db 20 dup(32),'| | -3- Print phones | |',13,10 ; Переглянути каталог

db 20 dup(32),'| | -0- Exit | |',13,10 ; Вихід

db 20 dup(32),'| M |__________________________| M |',13,10

db 20 dup(32),'| E | -4- [<-] Prev phone | E |',13,10 ; Попередній

db 20 dup(32),'| N | -5- Search by model | N |',13,10 ; пошук

db 20 dup(32),'| U | -6- [->] Next phone | U |',13,10 ; Наступний телефон

db 20 dup(32),'| | -7- Add new phone | |',13,10 ; Добавити

db 20 dup(32),'| | -8- Remove phone | |',13,10 ; Видалити

db 20 dup(32),'| | -9- Edit exists phone | |',13,10 ; Редагувати

db 20 dup(32),'|___|__________________________|___|',13,10,'$'

.code

;===============================

ShowMainMenu PROC NEAR

;-//- Вивід на екран ПУНКТІВ меню

lea DX, sMenu

call write

ret

ShowMainMenu ENDP

;====================================================

ClrPartScr PROC NEAR

; Затирає частину вікна(з 14 по 24 рядок)

push AX

push BX

push CX

mov al,0

mov ch,15

mov cl,0

mov dh,24

mov dl,79

mov bh,0F7h

mov AH, 07h ; прокручує вниз

INT 10h

mov al,15

call CursorToLine ; переміщає курсор

pop CX

pop BX

pop AX

ret

ClrPartScr ENDP

;====================================================

CursorToLine PROC NEAR

push DX

mov dL, 0 ; стовпець 0

mov dH, al ; В дЛ записуємо номер рядка

mov bH, 0 ; сторінка

mov aH, 02h ; ЗМІНА ПОЛОЖЕННЯ КУРСОРА

INT 10h

pop DX

ret

CursorToLine ENDP

;====================================================

ReadKeyProc PROC NEAR

mov AH, 00h ; Читання введеного користувачем символу

INT 16h

ret

ReadKeyProc ENDP

;===============================

write PROC NEAR

; Процедура виведення рядка символів

push AX

mov AH, 09h

INT 21h

pop AX

ret

write ENDP

;===============================

writeln PROC NEAR

; Процедура

push AX

push DX

mov AH, 09h

INT 21h

lea DX, sLN

INT 21h

pop DX

pop AX

ret

writeln ENDP

;===============================

WriteInt PROC NEAR;(AX)

mov si,0

mov cx,25

zanul:

mov WIbuff[si],0

add si,1

loop zanul

mov si,0

mov cx,10

dill:

cmp ax,10

jl last

xor dx,dx

div cx ; Ділимо DX:AX на CX (10),

xchg ax,dx ; Міняємо їх містами

add al,'0' ; Получимо в AL символ десяткової цифри

mov WIbuff[si],al

add si,1

xchg ax,dx

cmp ax,10

jge dill

last:

add al,'0'

mov WIbuff[si],al

add si,1
mov si,24

mov cx,25

vuv:

cmp WIbuff[si],0

jne cifr
sub si,1

loop vuv

cifr:

mov dl,WIbuff[si]

mov ah,02h

int 21h

sub si,1

loop vuv

ret

WriteInt ENDP
ReadInt PROC NEAR

xor AX, AX

xor BX, BX

xor CX, CX

xor DX, DX

call ReadString20

StrToIntLoop:

mov cx,ax ; в CX кількість цифр

mov si,0 ; лічильник

xor AX,AX ; в AX будем записувати число
cycle: ;цикл переводу

mov bL, vString20(si)

sub bL,30h

add AX,BX

add si,1

cmp cx,1

jne mnoj ;якщо CX<>1 (не остання цифра)


ret ; повернення з функції в програму

mnoj:

mov BL,10

mul BL; Ax*10

loop cycle

ReadInt ENDP
ConvertYear PROC NEAR

; int(mYear) -> AX

push dx bx

mov bl,10

mov al, mYear[3]

sub al, 30h

mov dx, ax
xor ax,ax

mov al, mYear[2]

sub al, 30h

mul bl

add dx,ax

xor ax,ax

mov al, mYear[1]

sub al, 30h

mul bl

mul bl

add dx,ax

xor ax,ax

mov al, mYear[0]

sub al, 30h

mul bl

mul bl

mul bl

add AX,dx

pop bx dx

ret

ConvertYear ENDP
ConvertCamera PROC NEAR

; int(mCamera) -> AX

push bx dx

mov bl,10

xor ax,ax

mov al, mCamera[1]

sub al, 30h

mov dx, ax
xor ax,ax

mov al, mCamera[0]

sub al, 30h

mul bl

add AX,dx

pop dx bx

ret

ConvertCamera ENDP

.data

sLN db 13,10,'$'

sSlash db '\$'

;-//- Змінні для роботи з ФАЙЛАМИ

vFileHandle DW ?

vFileName db "mp.txt",0

vFileHandleTMP DW ?

vFileNameTMP db "mp_tmp.txt",0

vString20 db 20 dup (' ')

vInt10 db 10 dup(' ')

vPhoneInd dw 0

vPhonesCNT dw 0

vMinYear dw 3000

vMaxYear dw 0

vMaxPxls dw 0

;-//- Повідомлення для введення/виведення даних про телефон

sEnterName db 5 dup(32),'Name: $'

sEnterModel db 5 dup(32),'Model: $'

sEnterYear db 5 dup(32),'Year: $'

sEnterCamera db 5 dup(32),'Camera: $'

sEnterPrice db 5 dup(32),'Price: $'

sPhoneInd db 5 dup(32),'Index: $'

sPhonesCnt db 5 dup(32),'Phones count: $'

sMaxPxls db 13,10,5 dup(32),'Max Pixels: $'

sMinYear db 13,10,5 dup(32),'Min year: $'

sMaxYear db 13,10,5 dup(32),'Max year: $'

;-//- СТРУКТУРА каталогу ТЕЛЕФОНІВ

mName db 20 dup(32),13,10,'$'

mModel db 20 dup(32),13,10,'$'

mYear db 4 dup(32),13,10,'$'

mCamera db 2 dup(32),13,10,'$'

mPrice db 5 dup(32),13,10,'$'

vStructSize dw 57

vAllStruct db 57 dup(?)

;-//- Змінні

srchPhoneModel db 20 dup(32),13,10,'$'

sStat db 25 dup(32),"<<< Some statistics... >>>$"

sPrintPhones db 14 dup(32),"<<< Catalog of phones! 4/6 to change phone.. >>>$"

sAddNewPhone db 12 dup(32),"<<< Add New Phone! Type the parameters, please.. >>>$"

sEditExistsPhone db 12 dup(32),"<<< Edit exists Phone! Type the parameters, please.. >>>$"

sDone db 13,10,"Done!$"

sCanceled db 13,10,"Canceled!$"

PhoneNotFound db 13,10,"Phone not found!$"

sEMopen db '***Error! Cannt open file!**',13,10,'$'

sEMaxCNT DB '***Error! Cannt add phone! There are to many phones!**',13,10,'$'

sAbout db 20 dup(32),'This program created by Ruslan Lyalko',13,10

db 20 dup(32),'Student of Engineering faculty UzhNU$'

;=====================================================================

.code

Init PROC NEAR

mov AX, @data

mov DS, AX

mov ES, AX

; Очищення вікна

MOV AL, 3 ; AL - код режима 80*25 (16 кольори)

MOV AH, 0 ; Встановлюємо відеорежим (Очищення екану)

INT 10H

; Прокрутка вниз, для зміни байтів атрибут

mov al,0

xor CX,CX

mov dh,24

mov dl,79

mov bh,0F3h ; атрибути

mov AH, 07h ; прокручує вниз

INT 10h

; Вивід ЗАГОЛОВКА прогрпми

lea DX, sProgramTitle

call write

; відкритя файла

call OpenFiles

mov vPhoneInd,0

;визначення розміру бази данних

mov AL, 2 ; зсув щодо кінця файла

mov CX, 0

mov DX, 0

mov BX, vFileHandle

mov AH, 42h

INT 21h

div vStructSize

mov vPhonesCNT, AX

ret

Init ENDP

;---***///***------***///***------***///***---

Destr PROC NEAR

; закриття файла

call CloseFiles

ret

Destr ENDP

;---***///***------***///***------***///***---

About PROC NEAR

; Процедура

lea DX, sAbout

call write

ret

About ENDP

;---***///***------***///***------***///***---

PrintStat PROC NEAR

; Процедура

lea DX, sStat

call writeln

;вивід к-сті телефонів

lea DX, sPhonesCnt

call write

mov AX, vPhonesCNT

call WriteInt

call Satistic ; виклик процедури яка знаходить дані

lea DX, sMinYear

call write

mov AX,vMinYear

call WriteInt

lea DX, sMaxYear

call write

mov AX,vMaxYear

call WriteInt

lea DX, sMaxPxls

call write

mov AX,vMaxPxls

call WriteInt

ret

PrintStat ENDP

;---***///***------***///***------***///***---

PrintPhones PROC NEAR

; --//--Процедура виводу на екран першого телефону в каталозі

lea DX, sPrintPhones

call writeln

mov vPhoneInd,0

call ShowPhone

ret

PrintPhones ENDP

;---***///***------***///***------***///***---

PrevPhone PROC NEAR

;-//- Процедура виводу на екран характеристик телефону

lea DX, sPrintPhones

call writeln

DEC vPhoneInd

call ShowPhone

cmp AX, 0FFFh

je FirstPh

ret

FirstPh: ; якщо це вже був перший телефон то виводимо його

INC vPhoneInd

call ShowPhone

ret

PrevPhone ENDP

;---***///***------***///***------***///***---

ViewPhone PROC NEAR

;-//- Процедура виводу на екран характеристик телефону

lea DX, sPrintPhones

call writeln

call SearchPhoneProc

cmp ax,0

je mNotFoundPhone

call ShowPhone

ret

mNotFoundPhone:

lea dx, PhoneNotFound

call write

ret

ViewPhone ENDP

;---***///***------***///***------***///***---

NextPhone PROC NEAR

;-//- Процедура виводу на екран характеристик телефону

lea DX, sPrintPhones

call writeln

INC vPhoneInd

call ShowPhone

cmp AX, 0FFFh

je LastPh

ret

LastPh: ; якщо це вже був останный телефон то виводимо його

DEC vPhoneInd

call ShowPhone

ret

NextPhone ENDP

;---***///***------***///***------***///***---

AddPhone PROC NEAR

;-//- добавлення нового телефону

; в кінець файлу

lea DX, sAddNewPhone

call writeln

cmp vPhonesCNT,1100

jg MaxCNT

mov AX, vPhonesCNT

mov vPhoneIND, AX

call AddEditPhone

ret

MaxCNT:

lea DX, sEMaxCNT

call writeln

ret

AddPhone ENDP

;---***///***------***///***------***///***---

RemovePhone PROC NEAR

;-//- Процедура для видалення телефону під індексом

; копіюємо в темп файл все крім того що потрібно було видалити

mov BX, vFileHandle

mov AL, 0

xor DX,DX

xor CX,CX

mov AH, 42h

INT 21h
xor SI, SI

mov CX, vPhonesCNT

CopyCycle1:

push CX


1   2   3   4   5   6

скачати

© Усі права захищені
написати до нас