Advertisement
Guest User

Untitled

a guest
May 28th, 2015
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         TITLE VIDEO
  2.         PAGE
  3.         include macro.lib   ;подключение файла с макросами
  4. ; Сегмент стека
  5. STT     SEGMENT PARA STACK    
  6.         DB 256 DUP("CCCC")
  7. STT     ENDS
  8. ;
  9. ;Сегмент данных
  10. DATE    SEGMENT PARA PUBLIC
  11. worker  struc   ;информация о сотруднике
  12. nam db  30 dup (' ')    ;фамилия, имя, отчество
  13. sex db  ' ' ;пол
  14. age db  4 dup (' ') ;год рождения
  15. worker  ends
  16. N=6         ;размерность базы данных
  17. ;массив структур
  18. StrWork worker  <>  ;рабочая структура для различных промежуточных манипуляций 
  19. sotr    worker N DUP (<>)   ;массив структур
  20.  
  21. mes1    db  10,13,10,13,'*************************************'
  22.     db      10,13,'*Обработка данных:                  *'
  23.     db  10,13,'*Режимы работы:                     *'
  24.     db  10,13,'*1-добавление;                      *'
  25.     db  10,13,'*2-просмотр  ;                      *'
  26.     db  10,13,'*3-поиск по полу;                   *'
  27.     db  10,13,'*4-поиск по году рождения           *'
  28.     db  10,13,'*5-удаление;                        *'
  29.     db  10,13,'*0-выход.                           *'
  30.     db  10,13,'*************************************'
  31.     db  10,13,'Введите выбор : ','$'
  32.  
  33.  
  34. mname   db  10,13,10,13,'Введите ФИО (не более 30 символов) - $'
  35. msex    db  10,13,'Введите пол (''м'' или ''ж'') - $'
  36. mage    db  10,13,'Введите год рождения (4 символа) - $'
  37.  
  38. findpol db  10,13,10,13,'Введите пол (''м'' или ''ж'') для поиска - $'
  39. findnam db  10,13,10,13,'Введите ФИО для поиска - $'
  40. findgr  db  10,13,10,13,'Введите год рождения (4 символа) для поиска - $'
  41. mes2    db  10,13,10,13,'ФИО - '
  42. mname1  db  30 dup (' ')
  43.     db  10,13,'Пол - '
  44. msex1   db  ' '
  45.     db  10,13,'Год рождения - '
  46. mage1   db  4 dup (' '),'$'
  47. mes4    db  10,13,10,13,'Запись успешно найдена!','$'
  48. mes3    db  10,13,10,13,'Количество удаленных записей =  !','$'
  49. mes5    db  10,13,10,13,'Количество найденных записей =  !','$'
  50. mes6    db      10,13,10,13,"           ФИО                Пол  Год рождения","$"
  51. mes7    db      10,13,10,13,47 DUP (" "),"$"
  52. Err1    db  10,13,10,13,'Нет места в базе данных.','$'
  53. Err2    db  10,13,10,13,'Такой записи нет в базе данных! Повторите запрос.','$'
  54. Thanks  db  10,13,10,13,'Программа завершила работу !','$'
  55. Flag    db  0   ;флаг для использования в процедуре delete
  56.  
  57. DATE ENDS
  58. ;
  59. ; Сегмент команд
  60. ; Главный модуль
  61. CODE    SEGMENT PARA PUBLIC
  62. PROG    PROC FAR
  63.         ASSUME CS:CODE,DS:DATE,ES:DATE,SS:STT
  64. ; Занести в стек такие начальные значения,
  65. ; чтобы программа могла возвратить управление DOS
  66. ;
  67.         PUSH DS        ; Поместить в стек номер блока адреса возврата
  68.         MOV AX,0       ; Обнулить регистр
  69.         PUSH AX        ; Поместить в стек нулевое смещение адреса возврата
  70. ;
  71. ; Инициировать  адрес сегмента данных
  72. ;
  73.         MOV AX,DATE
  74.         MOV DS,AX
  75.     push    ds
  76.     pop es
  77. ;выбор режима работы:
  78. go:
  79.     OutStr  mes1    ;вывод строки mes1 на экран
  80.     GetChar     ;ввод и определение режима работы
  81.     cmp al,31h
  82.     jne     mm1
  83.         call    Insert
  84.         jmp     go
  85. mm1:    cmp al,32h
  86.     jne mm2
  87.         call    Wiew
  88.         jmp     go
  89. mm2:    cmp al,33h
  90.     jne mm3
  91.         call    search
  92.         jmp     go
  93. mm3:    cmp al,34h
  94.     jne mm4
  95.         call    search1
  96.         jmp     go
  97. mm4:    cmp al,35h
  98.     jne mm5
  99.         call    delete
  100.         jmp     go
  101.  
  102. mm5:    cmp al,30h
  103.         jne     go
  104.         call    exit
  105.  
  106. exit:
  107.     OutStr  Thanks
  108.     _Exit   ;стандартный выход;
  109.  
  110.         RET                ; Возвратить управление DOS  
  111. PROG    ENDP
  112.  
  113. Insert  proc  NEAR
  114. ;добавление новой записи
  115. ;заполняем рабочую структуру
  116.     OutStr  mname  
  117.     GetStr  StrWork.nam,30
  118.     OutStr  msex   
  119.     GetStr  StrWork.sex,1
  120.     OutStr  mage   
  121.     GetStr  StrWork.age,4
  122. ;поиск свободного элемента в массиве структур (в ней все поля пустые):
  123.         cld
  124.     lea di,sotr
  125.     mov cx,N
  126. cyc1:
  127.     cmp [di].sex,' '    ;будем искать свободную запись по пустому полю sex
  128.     je  m1
  129.     add di,type worker
  130.     loop    cyc1
  131.     OutStr  Err1
  132.     jmp go
  133. ;копируем StrWork в свободную запись базы данных
  134. m1:        
  135.     lea si,StrWork  ;откуда - ds:si
  136. ;               ;куда - es:di (уже загружены)
  137.     mov cx,type worker
  138. rep movsb
  139. ;заканчиваем и уходим на основное меню программы:
  140.     jmp go
  141. Insert  endp
  142.  
  143. Wiew    proc    near
  144. ;процедурa вывода на экран содержимого базы
  145.     OutStr  mes6
  146.     push    ds
  147.     pop es 
  148.         mov     cx,N
  149.         cld
  150.     lea ax,mes7
  151.         add     ax,4
  152.     lea bx,Sotr
  153. wcyc2: 
  154.     push    cx
  155.     mov cx,30
  156.     mov di,ax  
  157.     mov si,bx
  158. rep movsb      
  159.         add     di,1
  160.         movsb
  161.         add     di,7
  162.         mov     cx,4
  163. rep     movsb
  164.         Outstr  mes7
  165.         pop     cx
  166.         add     bx,type worker
  167.         loop    wcyc2
  168. wret:   ret
  169. wiew    endp   
  170.  
  171. search  proc    near
  172. ;процедурa поиска записи по полу в массиве и вывода на экран ее содержимого
  173.     OutStr  findpol
  174.     GetStr  StrWork.sex,1
  175.     push    ds
  176.     pop es 
  177.     lea bx,sotr
  178.         add     bx,30
  179.     mov cx,N
  180.         mov     al,0
  181.         mov     Flag,al
  182. cyc2:  
  183.     push    cx
  184.     mov cx,1
  185.     mov di,bx  
  186.     lea si,StrWork
  187.         add     si,30
  188. repe    cmpsb       ;будем искать путем сравнения цепочек
  189.     jne m2  ;если цепочки не совпадают, то переход на следующую
  190.                         ;запись
  191.     Add Flag,1  ;запись найдена и добавим 1
  192.                         ;к количеству найденных записей
  193. ;выведем на экран содержимое найденной записи, ее адрес = bx-30  
  194.         push    bx
  195.         sub     bx,30
  196.         Call    find
  197.         pop     bx
  198. m2: add bx,type worker
  199.     pop cx
  200.     loop    cyc2
  201.     cmp Flag,0
  202.     jne m3
  203.     OutStr  Err2
  204.     jmp pret
  205. m3:     lea     bx,mes5
  206.         mov     al,flag
  207.         add     al,30H
  208.         add     bx,35
  209.         mov     [bx],al
  210.         OutStr  mes5
  211. pret:   ret
  212. search  endp   
  213.  
  214. Find    Proc Near
  215.     mov_string  mname1,[bx].nam,30
  216.     mov_string  msex1,[bx].sex,1
  217.     mov_string  mage1,[bx].age,4
  218.     OutStr  mes2
  219.         ret
  220. find    Endp
  221.  
  222. search1 proc    near
  223. ;процедурa поиска записи по году рождения в массиве
  224. ; и вывода на экран ее содержимого
  225.     OutStr  findgr
  226.     GetStr  StrWork.age,4
  227.     push    ds
  228.     pop es 
  229.     lea bx,sotr
  230.         add     bx,31
  231.     mov cx,N
  232.         mov     al,0
  233.         mov     Flag,al
  234. scyc2: 
  235.     push    cx
  236.     mov cx,4
  237.     mov di,bx  
  238.     lea si,StrWork
  239.         add     si,31
  240. repe    cmpsb       ;будем искать путем сравнения цепочек
  241.     jne sm2 ;если цепочки не совпадают, то переход на следующую
  242.                         ;запись
  243.     Add Flag,1  ;запись найдена и добавим 1
  244.                         ;к количеству найденных записей
  245. ;выведем на экран содержимое найденной записи, ее адрес = bx-30  
  246.         push    bx
  247.         sub     bx,31
  248.         Call    find
  249.         pop     bx
  250. sm2:    add bx,type worker
  251.     pop cx
  252.     loop    scyc2
  253.     cmp Flag,0
  254.     jne sm3
  255.     OutStr  Err2
  256.     jmp sret
  257. sm3:    lea     bx,mes5
  258.         mov     al,flag
  259.         add     al,30H
  260.         add     bx,35
  261.         mov     [bx],al
  262.         OutStr  mes5
  263. sret:   ret
  264. search1 endp   
  265.  
  266.  
  267. delete  proc NEAR
  268. ;удаление - очистка полей структуры пробелами
  269. ;сначала найдем нужную для удаления запись
  270.     OutStr  findnam
  271.     GetStr  StrWork.nam,30
  272.     push    ds
  273.     pop es 
  274.     lea bx,sotr
  275.     mov cx,N
  276.         mov     al,0
  277.         mov     Flag,al
  278. dcyc2: 
  279.     push    cx
  280.     mov cx,30
  281.     mov di,bx  
  282.     lea si,StrWork
  283. repe    cmpsb       ;будем искать путем сравнения цепочек
  284.     jne dm2 ;если цепочки не совпадают, то переход на следующую
  285.                         ;запись
  286.     add Flag,1  ;запись найдена и добавим 1
  287.                         ;к количеству найденных записей
  288.         Call    clear
  289. dm2:    add bx,type worker
  290.     pop cx
  291.         loop    dcyc2
  292.     cmp Flag,0
  293.     jne dm3
  294.     OutStr  Err2
  295.     jmp dret
  296. dm3:    lea     bx,mes3
  297.         mov     al,flag
  298.         add     al,30H
  299.         add     bx,35
  300.         mov     [bx],al
  301.     OutStr  mes3
  302. dret:   ret
  303. delete  endp
  304.  
  305. Clear   proc NEAR
  306. ;адрес удаляемой строки в bx
  307. ;очищаем поля записи, для чего используем макрокоманду null_string
  308.     null_string [bx].nam,30
  309.     null_string [bx].sex,1
  310.     null_string [bx].age,4
  311.         ret
  312. Clear   endp
  313. ; Конец сегмента команд
  314. CODE    ENDS
  315. END     PROG
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement