Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

отчёт№6

.doc
Скачиваний:
16
Добавлен:
09.06.2015
Размер:
655.36 Кб
Скачать

Оглавление

  • Оглавление -------------------------------------------------------------------------------------- 1

  • Задание ------------------------------------------------------------------------------------------- 2

  • Форматы входной и выходной таблиц ------------------------------------------------- 2

  • Блок-схема -------------------------------------------------------------------------------------- 3

  • Исходный код ---------------------------------------------------------------------------------- 5

  • Исходные данные и результат работы программы --------------------------------- 8

  • Исходные данные и результат работы программы

в виде дампа сегмента данных ------------------------------------------------------------ 8

Задание

Даны сведения о площади территории и численности населения разных стран:

  • название страны (10 символов);

  • название континента (7 символов);

  • площадь территории (тыс. кв. км);

  • количество жителей (тыс. чел.);

Сформировать упорядоченный по заданному признаку список N стран

  1. имеющих наименьшую площадь (по возрастанию) на заданном континенте;

В список включить название страны, площадь и количество жителей. Подсчитать суммарное число жителей в отобранных странах указанного типа.

Форматы входной и выходной таблиц

Имя таблицы

Имя поля таблицы

Формат

Число занимаемых байт

tabl1

country

db

10

continent

db

7

area

dw

2

people

db

1

tabl2

country2

db

10

continent2

db

7

area2

dw

2

people2

db

1

Блок-схема

Исходный код

INCLUDE C:\IO.asm

;Лабораторная работа №6

;Выполнил студентка группы УВА-211 Острикова Татьяна

;Вариант №8(a)

;Данны сведения о площади территории и численности населения разных стран:

; название страны (10 символов)

; название континента (7 символов)

; площадь территории (тыс. кв. км)

; количество жителей (тыс. чел.)

;Сформировать упорядоченный по заданному признаку список N стран

;имеющих наименьшую площадь (по возрастанию) на заданном континенте

;В список включить название страны, площадь и количество жителей.

;Подсчитать суммарное число жителей в отоборанных странах указанного типа

;=============================================================================

.model small

;Формат исходной таблицы (ИТ)

tabl1 struc

country db 10 dup (' ') ;название страны

continent db 7 dup (' ') ;название континента

area dw ? ;площадь

people db ? ;население

tabl1 ends

;Формат результирующей таблицы (РТ)

tabl2 struc

country2 db 10 dup (' ') ;название страны

continent2 db 7 dup (' ') ;название континента

area2 dw ? ;площадь

people2 db ? ;население

tabl2 ends

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

;Макрокоманда пересылки цепочек

;Вызов: movstr src,dest,len

;Параметры:

;src - идентификатор источника (в ds - сегмент источника)

;dest - идентификатор приемника (в es - сегмент приемника)

;len - число пересылаемых байт

;Ограничение: src при вызове не может определяться через di !!!

movstr macro src,dest,len

push cx ;спасти cx,si,di

push si ;

push di ;

mov cx,len ;размер цепочки в cx

lea di,dest ;адрес приемника в di

lea si,src ;адрес источника в si

rep movsb ;пересылка цепочки

pop di ;восстановить cx,si,di

pop si ;

pop cx ;

endm

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

.stack 256

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

.data

N equ 9 ;количество элементов ИТ

lens equ type tabl1 ;длина записи ИТ

lenr equ type tabl2 ;длина записи РТ

; Определение и инициализация ИТ

stabl tabl1 <'Russia','Eurasia',23716,223>

tabl1 <'India','Asia',14555,122>

tabl1 <'Germany','Europe',5483,156>

tabl1 <'China','Asia',10438,130>

tabl1 <'USA','SA',20048,87>

tabl1 <'France','Europe',4584,57>

tabl1 <'Egypt','Africa',12303,158>

tabl1 <'Canada','NA',15745,236>

tabl1 <'DPRK','Asia',985,175>

rtabl tabl2 N dup (<>) ;РТ

bf db 10,13,'$'

space db ' ' ;пробел

bufCountr db 10 dup(' '),' ','$' ;буфер для вывода страны

bufCont db 7 dup(' '),' ','$' ;буфер для вывода континента

buf tabl2 <> ;вспомогательный буфер для сортировки РТ

db 10,13,'$' ;$ - ограничитель строки (для вывода на экран)

;10,13 - коды перевода строки и возврата каретки

NRez db ? ;число отобранных стран

strCon db 'Asia' ;задаём континент

sin db 'Enter number (1-9):$' ;приглашение

str1 db 'Country:',' ','Continent:',' ','Area:',' ','People:',10,13,'$'

str2 db 'Country:',' ','Area:',' ','People:',10,13,'$'

;================================================================

.code

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

;процедура сортировки методом парных сравнений

sort proc

;подготавливаем регистры для цикла сортировки

cont: mov cl,NRez ;

dec cx ;в сх - число циклов сравнения (NRez-1)

mov dx,0 ;в dx - число перестановок пар (пока 0)

mov bx,0 ;в bx - смещение текущего элемента (строки) РТ

mov si,0

cycle:

mov ax,rtabl[si+lenr].area2 ;сравнить площадь следующего (в al)

cmp rtabl[si].area2,ax ;и текущего элементов

jbe cont1 ;если меньше - выбрать следующую пару (перестановки нет)

; перестановка

; 1-й (текущий)-> buf

movstr rtabl[si],buf,lenr

; 2-й (следующий)-> 1-й (текущий)

movstr rtabl[si+lenr],rtabl[si],lenr

; buf -> 2-й

movstr buf,rtabl[si+lenr],lenr

inc dx ;увеличить на единицу счетчик перестановок

cont1:

add si,lenr ;следующий элемент

inc bx

loop cycle ;если cx <> 0, продолжить сравнение след. пары

cmp dx,0 ;если зафиксирована хотя бы одна перестановка,

jnz cont ;повторить все сначала

ret

endp

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

start:

mov ax,@data

mov ds,ax ;настройка ds

mov es,ax ;и es на сегмент данных

cld ;сброс флага DF (направление обработки строк-вперед)

mov cx,N ;счетчик строк ИТ

mov dx,0 ;счетчик строк РТ

lea si,stabl ;адрес первой строки ИТ

lea di,rtabl ;адрес первой строки РТ

;====================================================

lea dx,str1 ;записываем в dx адрес шапки ИТ

mov ah,09h

int 21h

; Вывод строковых полей ИТ на экран

mov cl,N ;в cx - число элементов в ИТ

push si

print:

movstr [si].country,bufCountr,10 ;пересылка страны в буфер для вывода страны

outstr bufCountr ;вызов макроса вывода строки

movstr [si].continent,bufCont,7 ;пересылка континента в буфер для вывода континента

outstr bufCont ;вызов макроса вывода строки

outword [si].area,2,0 ;выводим площадь

outch space ;делаем пропуск между площадью и населением

mov bl,[si].people ;т.к. outword для слов, а people byte

outword bx,1,0 ;выводим население

outstr bf ;переходим на новую строку и возращаемся в начало

add si,lens ;смещение следующего элемента ИТ

loop print ;если cx <> 0, продолжить вывод

pop si

mov ax,0h

lea dx,sin ;записываем в dx адрес строки приглашения

mov ah,09h

int 21h ;предлагаем ввести число стран

flush ;макрос очистки буфера ввода с клавиатуры

inch al ;макрос для ввода символа в регистр al

;readkey

sub al,30h

mov NRez,al ;запоминаем в NRez число стран для вывода

mov cl,NRez

push di

push si

mov dx,0

next:

;пересылка данных из ИТ в РТ

;пересылка поля country -> country2

movstr [si].country,[di].country2,10

;пересылка поля continent -> continent2

movstr [si].continent,[di].continent2,7

;пересылка поля area -> area2

movstr [si].area,[di].area2,2

;пересылка поля people -> people2

movstr [si].people,[di].people2,1

; завершение блока пересылки

inc dx ;увеличить на 1 счетчик строк РТ

add di,lenr ;установить в di адрес начала следующей строки РТ

add si,lens ;в si - адрес начала следующей строки ИТ

loop next ;повторить цикл, если cx <> 0

pop si

pop di

cmp dx,1 ;если требуется более одной страны

ja beg ;перейти к сортировке

je print2 ;если только одна страна - на вывод

jmp quit ;в противном случае завершить работу

;===================================================

; Сортировка РТ (метод парных сравнений)

beg:

; Подготавливаем регистры

mov cx,0 ;

mov bx,0 ;обнуляем регистры счётчики и

mov dx,0

mov ax,0 ;регистры промежуточного хранения

push di

push si

call sort ;вызов процедуры сортировки

pop si

pop di

;===================================================

; Вывод строковых полей РТ на экран

lea dx,str2 ;записываем в dx адрес шапки РТ

mov ah,09h

int 21h

print2:

mov cl,NRez ;в cx - число элементов в РТ

mov bx,0 ;в bx - смещение текущего элемента (строки) РТ

mov si,di

mov dx,0 ;счётчик числа жителей отоборанных стран

new2:

;сначала проверяем континент

lea di,[si].continent2

push si

lea si,strCon

push cx

mov cx,4

repe cmpsb

pop cx

pop si

jnz next2 ;если не наш континент то переходим к следующему элементу

movstr [si].country2,bufCountr,10 ;пересылка тек. элемента в буфер

outstr bufCountr ;вызов макроса вывода

outword [si].area2,2,0 ;выводим площадь

outch space ;делаем пропуск между площадью и населением

mov bl,[si].people2 ;т.к. outword для слов, а people byte

add dx,bx

outword bx,1,0 ;выводим население

outstr bf ;переходим на новую строку и возращаемся в начало

next2:

add si,lenr ;смещение следующего элемента РТ

loop new2 ;если cx <> 0, продолжить вывод

;===================================================

quit:

mov ax,4c00h ;вызов функции завершения работы

int 21h ;

end start

Исходные данные и результаты работы программы

Исходные данные и результаты работы программы в виде дампа сегмента данных

8