1 2 3 4 5 6 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 |