Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

30 Имен, сортировку введенных имен в алфавитном порядке и вывод на экран

отсортированного списка имен.

__________________________________________________________________________

page 60,132

TITLE NMSORT (EXE) Ввод и сортировка имен

; -----------------------------------------------

STACK SGMENT PARA STACK 'Stack'

DW 32 DUP(?)

STACK 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(' ')) ;Таблица имен

NAMESAV DB 20 DUP(?), 13, 10, '$'

SWAPPED DB 00

DATA ENDS

; -----------------------------------------------

CODESG SEGMENT PARA 'Code'

BEGIN PROC FAR

ASSUME CS:CODESG,DS:DATDSG,SS:STACK,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 ;Есть ли еще имена?

JZ A30 ; нет - идти на сортировку

CMP NAMECTR,30 ;Введено 30 имен?

JE A30 ; да - идти на сортировку

CALL D10STOR ;Записать имя в таблицу

JMP A20LOOP

A30: ;Конец ввода имен

CALL Q10CLR ;Очистить экран

CALL Q20CURS ; и установить курсор

CMP NAMECTR,01 ;Введено менее 2 имен?

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

LES SI,NAMEFLD

MOV CX,10

REP MOVSV ;Переслать имя в таблицу

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 MOVSV

MOV AH,09

LEA DX,NAMESAV