Advertisement
Guest User

Untitled

a guest
May 12th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. TITLE NMSORT (EXE) Ввод и сортировка имен
  2. ; Программа обеспечивает ввод с клавиатуры до 30 имен,
  3. ;  сортировку введенных имен в алфавитном порядке
  4. ;  и вывод на экран отсортированного списка имен.
  5. ; -----------------------------------------------
  6. STACKSG SEGMENT PARA STACK 'Stack'
  7.     DW  32 DUP (?)
  8. STACKSG ENDS
  9. ; -----------------------------------------------
  10. DATASG SEGMENT PARA 'Data'
  11. NAMEPAR LABEL BYTE          ;Имя списка параметров:
  12. MAXNLEN DB  21          ; Максимальная длина
  13. NAMELEN DB  (?)         ; Число введенных символов
  14. NAMEFLD DB  21 DUP (' ')        ; Имя
  15.  
  16. CRLF    DB  13, 10,'$'
  17. ENDADDR DW  (?)
  18. MESSG1  DB  'Name?','$'
  19. NAMECTR DB  00
  20. NAMETAB DB  30 DUP(20 DUP(' ')) ;Таблица имен 30 РАЗ ПО 20 ПРОБЕЛОВ
  21. NAMESAV DB  20 DUP(?),13,10,'$'
  22. SWAPPED DB  00
  23. DATASG ENDS
  24.  
  25. ; -----------------------------------------------
  26.  
  27. CODESG SEGMENT PARA 'Code'
  28. BEGIN PROC FAR
  29.     ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG
  30.     PUSH    DS
  31.     SUB     AX,AX
  32.     PUSH    AX
  33.     MOV     AX,DATASG
  34.     MOV     DS,AX
  35.     MOV     ES,AX
  36.     CLD
  37.     LEA DI,NAMETAB
  38.     CALL    Q10CLR      ;Очистить экран
  39.     CALL    Q20CURS     ;Установить курсор
  40. A20LOOP:
  41.     CALL    B10READ     ;Ввести имя с клавиатуры
  42.     CMP NAMELEN,00  ;Есть еще имена?ЕСЛИ ВВЕЛИ 0 СИМВОЛОВ, ТО ИМЕН НЕТ, ИНАЧЕ ЕСТЬ
  43.     JZ  A30     ;  нет - на сортировку
  44.     CMP NAMECTR,30  ;Введено 30 имен?
  45.     JE  A30     ;  да - на сортировку
  46.     CALL    D10STOR     ;Записать имя в таблицу
  47.     JMP A20LOOP
  48. A30:  ;Конец ввода имен
  49.     CALL    Q10CLR      ;Очистить экран
  50.     CALL    Q20CURS     ;  и установить курсор
  51.     CMP NAMECTR,01  ;Введено менее двух имен?
  52.     JBE A40     ;  да - выйти
  53.     CALL    G10SORT     ;Сортировать имена
  54.     CALL    K10DISP     ;Вывести результат на экран
  55. A40:    RET         ;Завершить программу
  56. BEGIN ENDP
  57.  
  58. ;               Ввод имен с клавиатуры
  59. ;               ----------------------
  60. B10READ PROC
  61.     MOV AH,09
  62.     LEA DX,MESSG1   ;Вывести текст запроса
  63.     INT 21H
  64.    
  65.     MOV AH,0AH
  66.     LEA DX,NAMEPAR  ;Ввести имя
  67.     INT 21H
  68.    
  69.     MOV AH,09
  70.     LEA DX,CRLF     ;Вывести CRLF
  71.     INT 21H
  72.    
  73.     MOV BH,00       ;Очистить поле после имени
  74.     MOV BL,NAMELEN  ;Получить счетчик символов
  75.     MOV CX,21
  76.     SUB CX,BX       ;Вычислить оставшуюся длину
  77. B20:
  78.     MOV NAMEFLD[BX],20H ;Установить символ пробела
  79.     INC BX
  80.     LOOP    B20
  81.     RET
  82. B10READ ENDP
  83.  
  84. ;               Запись имени в таблицу
  85. ;               ----------------------
  86. D10STOR PROC
  87.     INC NAMECTR     ;Число имен в таблице
  88.     CLD
  89.     LEA SI,NAMEFLD;?
  90.     MOV CX,10
  91. REP MOVSW           ;Переслать имя в таблицу
  92.     RET
  93. D10STOR ENDP
  94.  
  95. ;               Сортировка имен в таблице
  96. ;               -------------------------
  97. G10SORT PROC
  98.     SUB DI,40       ;Установить адреса останова
  99.     MOV ENDADDR,DI
  100. G20:    MOV SWAPPED,00  ;Установить начало таблицы
  101.     LEA SI,NAMETAB
  102. G30:    MOV CX,20       ;Длина сравнения
  103.     MOV DI,SI
  104.     ADD DI,20       ;Следующее имя для сравнения
  105.     MOV AX,DI
  106.     MOV BX,SI
  107. REPE    CMPSB           ;Сравнить имя со следующим
  108.     JBE G40     ;  нет перестановки
  109.     CALL    H10XCHG     ;  перестановка
  110. G40:    MOV SI,AX
  111.     CMP SI,ENDADDR  ;Конец таблицы?
  112.     JBE G30     ;  нет - продолжить
  113.     CMP SWAPPED,00  ;Есть перестановки?
  114.     JNZ G20     ;  да - продолжить,
  115.     RET         ;  нет - конец сортировки
  116. G10SORT ENDP
  117.  
  118. ;               Перестановка элементов таблицы
  119. ;               ------------------------------
  120. H10XCHG PROC
  121.     MOV CX,10
  122.     LEA DI,NAMESAV
  123.     MOV SI,BX
  124. REP MOVSW           ;Сохранить меньший элемент
  125.     MOV CX,10
  126.     MOV DI,BX
  127. REP MOVSW           ;Переслать больший элемент
  128.                 ;  на место меньшего
  129.     MOV CX,10
  130.     LEA SI,NAMESAV
  131. REP MOVSW           ;Переслать сохраненный
  132.                 ;  элемент на место большего
  133.     MOV SWAPPED,01  ;Признак перестановки
  134.     RET
  135. H10XCHG ENDP
  136.  
  137. ;               Вывод на экран отсортированные имена
  138. ;               ------------------------------------
  139. K10DISP PROC
  140.     LEA SI,NAMETAB
  141. K20:
  142.     LEA DI,NAMESAV  ;Начальный адрес таблицы
  143.     MOV CX,10
  144.     REP MOVSW
  145.    
  146.     MOV AH,09
  147.     LEA DX,NAMESAV
  148.     INT 21H     ;Вывести на экран
  149.    
  150.     DEC NAMECTR     ;Последний элемент?
  151.     JNZ K20     ;  нет - повторить цикл,
  152.     RET         ;  да - выйти
  153. K10DISP ENDP
  154.  
  155. ;               Очистка экрана
  156. ;               --------------
  157. Q10CLR PROC
  158.     MOV AX,0600H
  159.     MOV BH,61H      ;Цвет (07 для ч/б)
  160.     XOR CX,CX
  161.     MOV DX,184FH
  162.     INT 10H
  163.     RET
  164. Q10CLR ENDP
  165.  
  166. ;               Установка курсора
  167. ;               -----------------
  168. Q20CURS PROC
  169.     MOV AH,02
  170.     SUB BH,BH
  171.     XOR DX,DX       ;Установить курсор в 00,00
  172.     INT 10H
  173.     RET
  174. Q20CURS ENDP
  175. CODESG ENDS
  176. END BEGIN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement