Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- TITLE VIDEO
- PAGE
- include macro.lib ;подключение файла с макросами
- ; Сегмент стека
- STT SEGMENT PARA STACK
- DB 256 DUP("CCCC")
- STT ENDS
- ;
- ;Сегмент данных
- DATE SEGMENT PARA PUBLIC
- worker struc ;информация о сотруднике
- nam db 30 dup (' ') ;фамилия, имя, отчество
- sex db ' ' ;пол
- age db 4 dup (' ') ;год рождения
- worker ends
- N=6 ;размерность базы данных
- ;массив структур
- StrWork worker <> ;рабочая структура для различных промежуточных манипуляций
- sotr worker N DUP (<>) ;массив структур
- mes1 db 10,13,10,13,'*************************************'
- db 10,13,'*Обработка данных: *'
- db 10,13,'*Режимы работы: *'
- db 10,13,'*1-добавление; *'
- db 10,13,'*2-просмотр ; *'
- db 10,13,'*3-поиск по полу; *'
- db 10,13,'*4-поиск по году рождения *'
- db 10,13,'*5-удаление; *'
- db 10,13,'*0-выход. *'
- db 10,13,'*************************************'
- db 10,13,'Введите выбор : ','$'
- mname db 10,13,10,13,'Введите ФИО (не более 30 символов) - $'
- msex db 10,13,'Введите пол (''м'' или ''ж'') - $'
- mage db 10,13,'Введите год рождения (4 символа) - $'
- findpol db 10,13,10,13,'Введите пол (''м'' или ''ж'') для поиска - $'
- findnam db 10,13,10,13,'Введите ФИО для поиска - $'
- findgr db 10,13,10,13,'Введите год рождения (4 символа) для поиска - $'
- mes2 db 10,13,10,13,'ФИО - '
- mname1 db 30 dup (' ')
- db 10,13,'Пол - '
- msex1 db ' '
- db 10,13,'Год рождения - '
- mage1 db 4 dup (' '),'$'
- mes4 db 10,13,10,13,'Запись успешно найдена!','$'
- mes3 db 10,13,10,13,'Количество удаленных записей = !','$'
- mes5 db 10,13,10,13,'Количество найденных записей = !','$'
- mes6 db 10,13,10,13," ФИО Пол Год рождения","$"
- mes7 db 10,13,10,13,47 DUP (" "),"$"
- Err1 db 10,13,10,13,'Нет места в базе данных.','$'
- Err2 db 10,13,10,13,'Такой записи нет в базе данных! Повторите запрос.','$'
- Thanks db 10,13,10,13,'Программа завершила работу !','$'
- Flag db 0 ;флаг для использования в процедуре delete
- DATE ENDS
- ;
- ; Сегмент команд
- ; Главный модуль
- CODE SEGMENT PARA PUBLIC
- PROG PROC FAR
- ASSUME CS:CODE,DS:DATE,ES:DATE,SS:STT
- ; Занести в стек такие начальные значения,
- ; чтобы программа могла возвратить управление DOS
- ;
- PUSH DS ; Поместить в стек номер блока адреса возврата
- MOV AX,0 ; Обнулить регистр
- PUSH AX ; Поместить в стек нулевое смещение адреса возврата
- ;
- ; Инициировать адрес сегмента данных
- ;
- MOV AX,DATE
- MOV DS,AX
- push ds
- pop es
- ;выбор режима работы:
- go:
- OutStr mes1 ;вывод строки mes1 на экран
- GetChar ;ввод и определение режима работы
- cmp al,31h
- jne mm1
- call Insert
- jmp go
- mm1: cmp al,32h
- jne mm2
- call Wiew
- jmp go
- mm2: cmp al,33h
- jne mm3
- call search
- jmp go
- mm3: cmp al,34h
- jne mm4
- call search1
- jmp go
- mm4: cmp al,35h
- jne mm5
- call delete
- jmp go
- mm5: cmp al,30h
- jne go
- call exit
- exit:
- OutStr Thanks
- _Exit ;стандартный выход;
- RET ; Возвратить управление DOS
- PROG ENDP
- Insert proc NEAR
- ;добавление новой записи
- ;заполняем рабочую структуру
- OutStr mname
- GetStr StrWork.nam,30
- OutStr msex
- GetStr StrWork.sex,1
- OutStr mage
- GetStr StrWork.age,4
- ;поиск свободного элемента в массиве структур (в ней все поля пустые):
- cld
- lea di,sotr
- mov cx,N
- cyc1:
- cmp [di].sex,' ' ;будем искать свободную запись по пустому полю sex
- je m1
- add di,type worker
- loop cyc1
- OutStr Err1
- jmp go
- ;копируем StrWork в свободную запись базы данных
- m1:
- lea si,StrWork ;откуда - ds:si
- ; ;куда - es:di (уже загружены)
- mov cx,type worker
- rep movsb
- ;заканчиваем и уходим на основное меню программы:
- jmp go
- Insert endp
- Wiew proc near
- ;процедурa вывода на экран содержимого базы
- OutStr mes6
- push ds
- pop es
- mov cx,N
- cld
- lea ax,mes7
- add ax,4
- lea bx,Sotr
- wcyc2:
- push cx
- mov cx,30
- mov di,ax
- mov si,bx
- rep movsb
- add di,1
- movsb
- add di,7
- mov cx,4
- rep movsb
- Outstr mes7
- pop cx
- add bx,type worker
- loop wcyc2
- wret: ret
- wiew endp
- search proc near
- ;процедурa поиска записи по полу в массиве и вывода на экран ее содержимого
- OutStr findpol
- GetStr StrWork.sex,1
- push ds
- pop es
- lea bx,sotr
- add bx,30
- mov cx,N
- mov al,0
- mov Flag,al
- cyc2:
- push cx
- mov cx,1
- mov di,bx
- lea si,StrWork
- add si,30
- repe cmpsb ;будем искать путем сравнения цепочек
- jne m2 ;если цепочки не совпадают, то переход на следующую
- ;запись
- Add Flag,1 ;запись найдена и добавим 1
- ;к количеству найденных записей
- ;выведем на экран содержимое найденной записи, ее адрес = bx-30
- push bx
- sub bx,30
- Call find
- pop bx
- m2: add bx,type worker
- pop cx
- loop cyc2
- cmp Flag,0
- jne m3
- OutStr Err2
- jmp pret
- m3: lea bx,mes5
- mov al,flag
- add al,30H
- add bx,35
- mov [bx],al
- OutStr mes5
- pret: ret
- search endp
- Find Proc Near
- mov_string mname1,[bx].nam,30
- mov_string msex1,[bx].sex,1
- mov_string mage1,[bx].age,4
- OutStr mes2
- ret
- find Endp
- search1 proc near
- ;процедурa поиска записи по году рождения в массиве
- ; и вывода на экран ее содержимого
- OutStr findgr
- GetStr StrWork.age,4
- push ds
- pop es
- lea bx,sotr
- add bx,31
- mov cx,N
- mov al,0
- mov Flag,al
- scyc2:
- push cx
- mov cx,4
- mov di,bx
- lea si,StrWork
- add si,31
- repe cmpsb ;будем искать путем сравнения цепочек
- jne sm2 ;если цепочки не совпадают, то переход на следующую
- ;запись
- Add Flag,1 ;запись найдена и добавим 1
- ;к количеству найденных записей
- ;выведем на экран содержимое найденной записи, ее адрес = bx-30
- push bx
- sub bx,31
- Call find
- pop bx
- sm2: add bx,type worker
- pop cx
- loop scyc2
- cmp Flag,0
- jne sm3
- OutStr Err2
- jmp sret
- sm3: lea bx,mes5
- mov al,flag
- add al,30H
- add bx,35
- mov [bx],al
- OutStr mes5
- sret: ret
- search1 endp
- delete proc NEAR
- ;удаление - очистка полей структуры пробелами
- ;сначала найдем нужную для удаления запись
- OutStr findnam
- GetStr StrWork.nam,30
- push ds
- pop es
- lea bx,sotr
- mov cx,N
- mov al,0
- mov Flag,al
- dcyc2:
- push cx
- mov cx,30
- mov di,bx
- lea si,StrWork
- repe cmpsb ;будем искать путем сравнения цепочек
- jne dm2 ;если цепочки не совпадают, то переход на следующую
- ;запись
- add Flag,1 ;запись найдена и добавим 1
- ;к количеству найденных записей
- Call clear
- dm2: add bx,type worker
- pop cx
- loop dcyc2
- cmp Flag,0
- jne dm3
- OutStr Err2
- jmp dret
- dm3: lea bx,mes3
- mov al,flag
- add al,30H
- add bx,35
- mov [bx],al
- OutStr mes3
- dret: ret
- delete endp
- Clear proc NEAR
- ;адрес удаляемой строки в bx
- ;очищаем поля записи, для чего используем макрокоманду null_string
- null_string [bx].nam,30
- null_string [bx].sex,1
- null_string [bx].age,4
- ret
- Clear endp
- ; Конец сегмента команд
- CODE ENDS
- END PROG
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement