отчёт№6
.doc
Оглавление
-
Оглавление -------------------------------------------------------------------------------------- 1
-
Задание ------------------------------------------------------------------------------------------- 2
-
Форматы входной и выходной таблиц ------------------------------------------------- 2
-
Блок-схема -------------------------------------------------------------------------------------- 3
-
Исходный код ---------------------------------------------------------------------------------- 5
-
Исходные данные и результат работы программы --------------------------------- 8
-
Исходные данные и результат работы программы
в виде дампа сегмента данных ------------------------------------------------------------ 8
Задание
Даны сведения о площади территории и численности населения разных стран:
-
название страны (10 символов);
-
название континента (7 символов);
-
площадь территории (тыс. кв. км);
-
количество жителей (тыс. чел.);
Сформировать упорядоченный по заданному признаку список N стран
-
имеющих наименьшую площадь (по возрастанию) на заданном континенте;
В список включить название страны, площадь и количество жителей. Подсчитать суммарное число жителей в отобранных странах указанного типа.
Форматы входной и выходной таблиц
Имя таблицы |
Имя поля таблицы |
Формат |
Число занимаемых байт |
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
Исходные данные и результаты работы программы
Исходные данные и результаты работы программы в виде дампа сегмента данных