Блок-схема алгоритма работы программы
Сначала программа записывает данные во внешнюю память. После этого она считывает исходные числа из внешней памяти во внутреннюю и одновременно сортирует их.
Процесс сортировки происходит во время считывания данных из внешней памяти и выглядит следующим образом.
Программа просматривает все исходные числа во внешней памяти и выбирает самое большое число. После этого она записывает это число в ячейку во внутренней памяти с самым большим запланированным номером. Далее ячейка во внешней памяти, откуда было считано это число, обнуляется.
После этого снова производится поиск самого большого из оставшихся чисел, это число записывается в следующую ячейку во внешней памяти.
Процесс продолжается до использования всех чисел из внешней памяти.
После этого отсортированные элементы переписываются обратно во внешнюю память.
Использование памяти
Участки памяти:
Xdata: 0000h…0019h – область сортируемых чисел
data: 40h…53h - область, используемая для промежуточного хранения и сортировки чисел
Регистры:
DPTR: хранит адрес байта в XDATA (0000h..0019h).
A: используется как буфер для передачи данных из XDATA в DATA и для копирования данных из одного участка памяти в другой.
R0: хранит адрес обрабатываемого элемента в DATA (40h..53h)
R1: используется как локальный счетчик цикла.
R2: хранит данные из DPL для запоминания адреса текущего самого большего элемента.
Участок 36h: хранит текущее самое большое число.
Рис 1.
Листинг программы
org 00h ;смещение от начала
jmp start ;переход к началу
org 50h ;память данных
Start:
; ИНИЦИАЛИЗАЦИЯ
module_create_data: ;Модуль устанавливает начальные значения байтам в XDATA с адресами 00h..09h
mov DPTR, #0000h ;адрес
mov A, #13h ; 1-e число
movx @DPTR, A ; занести число по адресу
inc DPTR ;увеличить адрес на 1
mov A, #11h ; 2-e число
movx @DPTR, A
inc DPTR
mov A, #01h ; 3-e число
movx @DPTR, A
inc DPTR
mov A, #17h ; 4-e число
movx @DPTR, A
inc DPTR
mov A, #07h ; 5-e число
movx @DPTR, A
inc DPTR
mov A, #03h ; 6-e число
movx @DPTR, A
inc DPTR
mov A, #21h ; 7-e число
movx @DPTR, A
inc DPTR
mov A, #32h ; 8-e число
movx @DPTR, A
inc DPTR
mov A, #32h ; 9-e число
movx @DPTR, A
inc DPTR
mov A, #12h ; 10-e число
movx @DPTR, A
mov A, #42h ; 11-e число
movx @DPTR, A
inc DPTR
mov A, #34h ; 12-e число
movx @DPTR, A
inc DPTR
mov A, #22h ; 13-e число
movx @DPTR, A
inc DPTR
mov A, #14h ; 14-e число
movx @DPTR, A
inc DPTR
mov A, #55h ; 15-e число
movx @DPTR, A
inc DPTR
mov A, #11h ; 16-e число
movx @DPTR, A
inc DPTR
mov A, #17h ; 17-e число
movx @DPTR, A
inc DPTR
mov A, #77h ; 18-e число
movx @DPTR, A
inc DPTR
mov A, #31h ; 19-e число
movx @DPTR, A
inc DPTR
mov A, #12h ; 20-e число
movx @DPTR, A
;СОРТИРОВКА module_sort_massiv: метка начала сортировки mov R0, #53h metka1: метка главного цикла сортировки mov 54h, #00h mov R2, DPL jmp module_search_massiv переход на метку поиска макс metka_vozvrata1: метка возврата из поиска макс эл. mov DPL, R2 mov A, #00h dec DPL movx @DPTR, A mov @R0, 54h dec R0 cjne R0, #3Fh, metka1 jmp module_data_to_xdata переход на метку вывода данных ;ДОПОЛНИТЕЛЬНЫЕ МОДУЛИ module_search_massiv: начало кода поска макс эл массива mov DPTR, #0000h metka2: главный цикл поиска movx A, @DPTR inc DPTR mov R1, DPL cjne A, 54h, metka3 metka_vozvrata2: перед возвратом cjne R1, #14h, metka2 переход на метку вложенного цикла jmp metka_vozvrata1 переход на возврат из поиска metka3: jc metka_vozvrata2 продолжаем сканировать mov 54h, A mov R2, DPL jmp metka_vozvrata2 пока все не переберем программа в цикле ;ПЕРЕМЕЩЕНИЕ ОТСОРТИРОВАННЫХ ЧИСЕЛ ОБРАТНО ВО ВНЕШНЮЮ ПАМЯТЬ
module_data_to_xdata: mov DPTR, #0000h mov R0, #40h metka4: цикл вывода mov A, @R0 movx @DPTR, A inc DPTR inc R0 cjne R0, #54h, metka4 на метку цикла
final:
end.
Результаты выполнения программы:
до сортировки |
После сортировки |
13h |
01h |
11h |
03h |
01h |
07h |
17h |
11h |
07h |
11h |
03h |
12h |
21h |
12h |
32h |
13h |
32h |
14h |
12h |
17h |
42h |
17h |
34h |
21h |
22h |
22h |
14h |
31h |
55h |
32h |
11h |
32h |
17h |
34h |
77h |
42h |
31h |
55h |
12h |
77h |
Таблица команд и число их выполнения:
mov DPTR, #0000h |
21 |
mov R0, #53h |
21 |
movx @DPTR, A |
60 |
inc DPTR |
420 |
inc R0 |
20 |
cjne R0, #3Fh, metka1 |
460 |
dec R0 |
20 |
mov @R0, 54h |
20 |
mov A, #31h |
40 |
mov 54h, #00h |
20 |
mov R2, DPL |
560 |
jmp metka_vozvrata |
180 |
movx A, @DPTR |
420 |
cjne A, 54h, metka3 |
400 |
jc metka_vozvrata2 |
400 |
mov 54h, A |
140 |
mov DPL, R2 |
20 |
dec DPL |
20 |
mov A, @R0 |
20 |
Время затраченное программой на своё выполнение:
t = 5 + 20 + 20 + 40 + 60 + 20 + 100 + 80 + 40 + 400 + 40 + 60 + 1680 + 540 + 420 + 1200 + 800 + 280 + 1320 + 40 + 40 = 7305 тактов = 609 циклов = 203 мкс
Объём памяти занимаемый программой:
V = 24 * (1 + 20 + 20 + 20 + 20 + 20 + 20 + 40 + 400 + 20 + 560 + 180 + 420 + 400 + 400 + 440 + 20) + 12 * (1 + 20 + 20 + 20 + 40 + 20 + 140 + 20) = 74916 байт = 73Кб
Заключение
Задача сортировки (упорядочения) элементов массива в соответствии с их значением – классическая задача, исследование которой началось еще с момента появления первых ЭВМ. Создано много различных алгоритмов сортировки, однако задача разработки такого метода сортировки, который был бы эффективен для массивов с любым количеством элементов, т.е. упорядочивал массив за наименьшее количество времени при минимальном объеме затрачиваемой памяти, не потеряла своей актуальности. В последнее время появилось достаточно много эффективных алгоритмов сортировки, которые базируются на принципах рекурсии, динамического программирования. В этой работе использовался метод сортировки выборкой.
Литература:
Герасимов В.В. «Микропроцессорное устройство и управление роботов» лекции 2012
http://atdevil.ru/wp-content/uploads/2011/02/mcs51.pdf
“Система команд микроконтроллеров MCS-51”, http://www.gaw.ru/html.cgi/txt/doc/micros/mcs51/asm/start.htm
