Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler 01.doc
Скачиваний:
19
Добавлен:
09.11.2019
Размер:
727.04 Кб
Скачать

6. Программа: сортировка элементов таблицы.

6.1. Записать в текстовом редакторе NORTON следующую программу в ЕХЕ-формате:

.286

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

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

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

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 ;Установить курсор А20

A20: CALL B10READ ;Ввести имя с клавиатуры

CMP NAMELEN,00 ;Есть еще имена?

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

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

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

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

JMP A20

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 ;Вывести CLRF

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 для ч/б)

SUB CX,CX

MOV DX,184FH

INT 10H

RET

Q10CLR ENDP

; Установка курсора

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

Q20CURS PROC

MOV AH,02

SUB BH,BH

SUB DX,DX ;Установить курсор в 0

INT 10H

RET

Q20CURS ENDP

CODESG ENDS

END BEGIN

Программа обеспечивает ввод с клавиатуры до 30 имен, сортировку введенных имен в алфавитном порядке и вывод на экран отсортированного списка имен.

6.2. Выполнить ассемблирование и компоновку программы. Листинг программы записать в отчет.

6.3. Запустить программу из панели NORTON. Выводы о работе программы записать в отчет.

СОДЕРЖАНИЕ ОТЧЕТА:

1. Листинги программ.

2. Выводы о работе программ.

КОНТРОЛЬНЫЕ ВОПРОСЫ:

1. Определите таблицу, содержащую 3 символьных значения - JANV,FEVR,MART.

Составьте команды для получения адреса второго элемента таблицы символьных значений FEVR в регистре SI по правилу прямого табличного доступа.

2. Определите таблицу, содержащую 3 числовых значения - 51,81,91.

Составьте команды для получения адреса элемента таблицы, имеющего значение 81 в регистре SI по правилу табличного поиска.

3. Определите таблицу, содержащую 3 символьных значения - JANV,FEVR,MART.

Составьте команды для получения адреса второго элемента таблицы FEVR в регистре SI по правилу табличного поиска с использованием сравнения строк.

4. Составить программу перекодировки десятичной цифры (от 0 до 9) в ASCII-код с использованием команды XLAT и таблицы перекодировки.

ОТВЕТЫ:

1. MONTAB DB 'JANV','FEVR','MART'

LEA SI,MONTAB

MOV AL,32H

XOR AL,30H

DEC AL

MUL 04

ADD SI,AL

2. COSTAB DB 51,81,91

MOV CX,03

A20: MOV AX,81

LEA SI,COSTAB

CMP AX,[SI]

JE A30

ADD SI,02

LOOP A20

A30: RET

3. MONTAB DB 'JANV','FEVR','MART'

STOKIN DB 'FEVR'

LEA SI,MONTAB

A20: MOV CX,04

LEA DI,STOKIN

REPE CMPSB

JE A30

ADD SI,CX

JMP A20

A30: RET

4. ASCNO DB 8

EBCNO DB DUP(' ')

XLTAB DB 30H,31H,32H,33H,34H

DB 35H,36H,37H,38H,39H

LEA SI,ASCNO

LEA DI,EBCNO

MOV CX,01

LEA BX,XLTAB

MOV AL,[SI]

XLAT

MOV [DI],AL

Л а б о р а т о р н а я р а б о т а N 10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]