Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- TITLE NMSORT (EXE) Ввод и сортировка имен
- ; Программа обеспечивает ввод с клавиатуры до 30 имен,
- ; сортировку введенных имен в алфавитном порядке
- ; и вывод на экран отсортированного списка имен.
- ; -----------------------------------------------
- STACKSG SEGMENT PARA STACK 'Stack'
- DW 32 DUP (?)
- STACKSG ENDS
- ; -----------------------------------------------
- DATASG SEGMENT PARA 'Data'
- NAMEPAR LABEL BYTE ;Имя списка параметров:
- MAXNLEN DB 21 ; Максимальная длина
- NAMELEN DB (?) ; Число введенных символов
- NAMEFLD DB 21 DUP (' ') ; Имя
- CRLF DB 13, 10,'$'
- ENDADDR DW (?)
- MESSG1 DB 'Name?','$'
- NAMECTR DB 00
- NAMETAB DB 30 DUP(20 DUP(' ')) ;Таблица имен 30 РАЗ ПО 20 ПРОБЕЛОВ
- NAMESAV DB 20 DUP(?),13,10,'$'
- SWAPPED DB 00
- DATASG ENDS
- ; -----------------------------------------------
- CODESG SEGMENT PARA 'Code'
- BEGIN PROC FAR
- ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG
- PUSH DS
- SUB AX,AX
- PUSH AX
- MOV AX,DATASG
- MOV DS,AX
- MOV ES,AX
- CLD
- LEA DI,NAMETAB
- CALL Q10CLR ;Очистить экран
- CALL Q20CURS ;Установить курсор
- A20LOOP:
- CALL B10READ ;Ввести имя с клавиатуры
- CMP NAMELEN,00 ;Есть еще имена?ЕСЛИ ВВЕЛИ 0 СИМВОЛОВ, ТО ИМЕН НЕТ, ИНАЧЕ ЕСТЬ
- JZ A30 ; нет - на сортировку
- CMP NAMECTR,30 ;Введено 30 имен?
- JE A30 ; да - на сортировку
- CALL D10STOR ;Записать имя в таблицу
- JMP A20LOOP
- A30: ;Конец ввода имен
- CALL Q10CLR ;Очистить экран
- CALL Q20CURS ; и установить курсор
- CMP NAMECTR,01 ;Введено менее двух имен?
- JBE A40 ; да - выйти
- CALL G10SORT ;Сортировать имена
- CALL K10DISP ;Вывести результат на экран
- A40: RET ;Завершить программу
- BEGIN ENDP
- ; Ввод имен с клавиатуры
- ; ----------------------
- B10READ PROC
- MOV AH,09
- LEA DX,MESSG1 ;Вывести текст запроса
- INT 21H
- MOV AH,0AH
- LEA DX,NAMEPAR ;Ввести имя
- INT 21H
- MOV AH,09
- LEA DX,CRLF ;Вывести CRLF
- INT 21H
- MOV BH,00 ;Очистить поле после имени
- MOV BL,NAMELEN ;Получить счетчик символов
- MOV CX,21
- SUB CX,BX ;Вычислить оставшуюся длину
- B20:
- MOV NAMEFLD[BX],20H ;Установить символ пробела
- INC BX
- LOOP B20
- RET
- B10READ ENDP
- ; Запись имени в таблицу
- ; ----------------------
- D10STOR PROC
- INC NAMECTR ;Число имен в таблице
- CLD
- LEA SI,NAMEFLD;?
- MOV CX,10
- REP MOVSW ;Переслать имя в таблицу
- RET
- D10STOR ENDP
- ; Сортировка имен в таблице
- ; -------------------------
- G10SORT PROC
- SUB DI,40 ;Установить адреса останова
- MOV ENDADDR,DI
- G20: MOV SWAPPED,00 ;Установить начало таблицы
- LEA SI,NAMETAB
- G30: MOV CX,20 ;Длина сравнения
- MOV DI,SI
- ADD DI,20 ;Следующее имя для сравнения
- MOV AX,DI
- MOV BX,SI
- REPE CMPSB ;Сравнить имя со следующим
- JBE G40 ; нет перестановки
- CALL H10XCHG ; перестановка
- G40: MOV SI,AX
- CMP SI,ENDADDR ;Конец таблицы?
- JBE G30 ; нет - продолжить
- CMP SWAPPED,00 ;Есть перестановки?
- JNZ G20 ; да - продолжить,
- RET ; нет - конец сортировки
- G10SORT ENDP
- ; Перестановка элементов таблицы
- ; ------------------------------
- H10XCHG PROC
- MOV CX,10
- LEA DI,NAMESAV
- MOV SI,BX
- REP MOVSW ;Сохранить меньший элемент
- MOV CX,10
- MOV DI,BX
- REP MOVSW ;Переслать больший элемент
- ; на место меньшего
- MOV CX,10
- LEA SI,NAMESAV
- REP MOVSW ;Переслать сохраненный
- ; элемент на место большего
- MOV SWAPPED,01 ;Признак перестановки
- RET
- H10XCHG ENDP
- ; Вывод на экран отсортированные имена
- ; ------------------------------------
- K10DISP PROC
- LEA SI,NAMETAB
- K20:
- LEA DI,NAMESAV ;Начальный адрес таблицы
- MOV CX,10
- REP MOVSW
- MOV AH,09
- LEA DX,NAMESAV
- INT 21H ;Вывести на экран
- DEC NAMECTR ;Последний элемент?
- JNZ K20 ; нет - повторить цикл,
- RET ; да - выйти
- K10DISP ENDP
- ; Очистка экрана
- ; --------------
- Q10CLR PROC
- MOV AX,0600H
- MOV BH,61H ;Цвет (07 для ч/б)
- XOR CX,CX
- MOV DX,184FH
- INT 10H
- RET
- Q10CLR ENDP
- ; Установка курсора
- ; -----------------
- Q20CURS PROC
- MOV AH,02
- SUB BH,BH
- XOR DX,DX ;Установить курсор в 00,00
- INT 10H
- RET
- Q20CURS ENDP
- CODESG ENDS
- END BEGIN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement