Микропроцессоры и интерфейсные средства транспортных средств
Автор работы: Пользователь скрыл имя, 29 Ноября 2014 в 15:27, курсовая работа
Описание работы
Задание: Разработать блок-схему алгоритма, программу на языке ассемблера МП КР580ВМ80А и в машинных кодах для решения задачи:
"Упорядочить массив из 12 1-байтовых чисел со знаком, расположив четные числа в порядке возрастания модулей, найти среднее арифметическое четных чисел".
Файлы: 1 файл
Kursovaja.doc
— 311.50 Кб (Скачать файл)Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
Московский государственный индустриальный университет
(ФГБОУ ВПО «МГИУ»)
Кафедра «Естественно-научные и инженерно-технические дисциплины»
Курсовая работа
По дисциплине «Микропроцессоры и интерфейсные
средства транспортных
Группа |
Нл09Ап21 |
Преподаватель |
Палагута К.А |
Москва 2013
Задание: Разработать блок-схему алгоритма, программу на языке ассемблера МП КР580ВМ80А и в машинных кодах для решения задачи:
"Упорядочить массив из 12 1-байтовых чисел со знаком, расположив четные числа в порядке возрастания модулей, найти среднее арифметическое четных чисел".
Адрес |
Код |
Метка |
Команда |
Комментарий |
Обнуление рабочих ячеек | ||||
0800 |
21200A |
lxi h,0A20h |
Загружаем начальный адрес (с которого будем очищать) | |
0803 |
0EE0 |
mvi c,0E0h |
Загружаем счетчик количества адресов числом E0 | |
0805 |
AF |
xra a |
Очищаем аккумулятор | |
0806 |
77 |
fill: |
mov m,a |
Обнуляем значение ячейки адреса |
0807 |
23 |
inx h |
Переходим к следующему адресу | |
0808 |
0D |
dcr c |
Уменьшаем счетчик | |
0809 |
C20608 |
jnz fill |
Проверяем равенство счетчика нулю, если равен, то прекращаем выполнять обнуление | |
080C |
21000A |
lxi h,0A00h |
Загружаем начальный адрес (с которого будем копировать) | |
080F |
11200A |
lxi d,0A20h |
Загружаем начальный адрес (куда будем копировать) | |
0812 |
0E0C |
mvi c,0Ch |
Загружаем счетчик количества адресов числом 0Ch | |
0814 |
7E |
copy: |
mov a,m |
Загрузить байт из адреса-источника в аккумулятор |
0815 |
12 |
stax d |
Сохранить аккумулятор в байте по адресу приеменика | |
0816 |
23 |
inx h |
Переходим к следующему адресу источника | |
0817 |
13 |
inx d |
Переходим к следующему адресу приемника | |
0818 |
0D |
dcr c |
Уменьшаем счетчик | |
0819 |
C21408 |
jnz copy |
Проверяем равенство счетчика нулю, если равен, то прекращаем выполнять обнуление | |
Выборка четных чисел из массива | ||||
081C |
01000A |
lxi b,0A00h |
Загрузка начальных адресов | |
081F |
11300A |
lxi d,0A30h | ||
0812 |
210C00 |
lxi h,000ch |
Загрузка кол-ва элементов массива и обнуление кол-ва нечетных чисел | |
0825 |
0A |
label1: |
ldax b |
Загрузка числа из исходного массива в аккумулятор |
0826 |
E601 |
ani 01 |
Проверка на четность (если четно, то переходим на Label2, если нечетно – выполняем следующую команду) | |
0828 |
CA2F08 |
jz label2 |
||
082B |
0A |
ldax b |
Пересохраняем на новый адрес, если число нечетное | |
082C |
12 |
stax d |
||
082D |
13 |
inx d |
Увеличиваем адрес для перехода к следующему элементу массива | |
082E |
24 |
inr h |
Увеличиваем количество найденных нечетных значений | |
082F |
03 |
label2: |
inx b |
Увеличиваем адрес для перехода к следующему элементу массива |
0830 |
2D |
dcr l |
Уменьшаем количество оставшихся элементов массива | |
0831 |
C22508 |
jnz label1 |
Если не 0, переход на label1, иначе выполняем следующую команду | |
0834 |
7C |
mov a,h |
Загрузить в аккумулятор количество найденных нечетных значений | |
0835 |
32A00A |
sta 0aa0h |
Сохранить количество найденных нечетных значений по адресу AA0 | |
Заполнение массива модулей элементов | ||||
0838 |
01000A |
lxi b,0a00h |
Загрузка начальных адресов | |
083B |
11500A |
lxi d,0a50h |
||
083E |
260C |
mvi h,0ch |
Загрузка кол-ва элементов массива | |
0840 |
0A |
label11: |
ldax b |
Загрузка числа из исходного массива |
0841 |
E680 |
ani 80 |
Проверка на знак | |
0843 |
0A |
ldax b |
Перезагрузить число | |
0844 |
CA5308 |
jz label12 |
Если число положительное, переход на label12, если отрицательное – то следующая команда | |
0847 |
FE80 |
cpi 80h |
Проверка на возникновение отрицательного нуля | |
0849 |
CA5108 |
jz label13 |
Если возник отрицательный ноль, заменяем его на 00 | |
084C |
2F |
cma |
Инвертирование числа | |
084D |
3C |
inr a |
Прибавление 1 к результату | |
084E |
C34708 |
jmp label12 |
Конец преобразования модуля | |
0851 |
3E00 |
label13: |
mvi a,00 |
Отрицательный ноль заменяем на 00 |
0853 |
12 |
label12: |
stax d |
Пересохраняем на новый адрес |
0854 |
03 |
inx b |
Увеличиваем адрес для перехода к следующему элементу исходного массива | |
0855 |
13 |
inx d |
Увеличиваем адрес для перехода к следующему элементу массива модулей чисел | |
0856 |
25 |
dcr h |
Уменьшаем количество оставшихся элементов массива | |
0857 |
C24008 |
jnz label11 |
Если не 0, переход на label11, иначе выполняем следующую команду | |
Сортировка | ||||
085A |
3E0C |
mvi a,0ch |
Загружаем счетчик количества проходов внешнего цикла (кол-во элементов) | |
085C |
32700A |
sta 0a70h |
Сохраняем счетчик количества проходов внешнего цикла | |
085F |
2E0C |
label22: |
mvi l,0ch |
Загружаем количество элементов массива |
0861 |
3A700A |
lda 0a70h |
Уменьшаем счетчик количества проходов | |
0864 |
3D |
dcr a | ||
0865 |
32700A |
sta 0a70h | ||
0868 |
CA9008 |
jz label21 |
Проверяем условие окончания сортировки | |
086B |
01500A |
lxi b, 0A50h |
Загружаем начальный адрес массива модулей чисел (адрес первого элемента) | |
086E |
11200A |
lxi d, 0A20h |
Загружаем начальный адрес массива знаковых значений чисел (адрес первого элемента) | |
0871 |
2D |
label23: |
dcr l |
Проверяем достижение последнего элемента массива, если он достигнут – переходим на проверку счетчика количества проходов |
0872 |
CA5F08 |
jz label22 | ||
0875 |
0A |
ldax b |
Загружаем модуль первого числа | |
0876 |
67 |
mov h, a |
Сохраняем его в регистре H | |
0877 |
03 |
inx b |
Переходим к модулю второго (следующего) числа | |
0878 |
0A |
ldax b |
Загружаем модуль второго числа | |
0879 |
BC |
cmp h |
Сравниваем его с модулем из регистра H | |
087A |
13 |
inx d |
Переходим к следующему числу в массиве знаковых значений чисел | |
087B |
DA6708 |
jc label23 |
Если нет заема (т.е. первое число оказалось меньше второго), то меняем числа местами, если есть заем – переходим к проверке достижения последнего элемента массива | |
087E |
0B |
dcx b |
Меняем местами числа в массиве модулей | |
087F |
02 |
stax b | ||
0880 |
03 |
inx b | ||
0881 |
7C |
mov a, h | ||
0882 |
02 |
stax b | ||
0883 |
1B |
dcx d |
Меняем местами числа в массиве знаковых значений, соответствующие числам в массиве модулей | |
0884 |
1A |
ldax d | ||
0885 |
67 |
mov h, a | ||
0886 |
13 |
inx d | ||
0887 |
1A |
ldax d | ||
0888 |
1B |
dcx d | ||
0889 |
12 |
stax d | ||
088A |
13 |
inx d | ||
088B |
7C |
mov a, h | ||
088C |
12 |
stax d | ||
088D |
C37108 |
jmp label23 |
Переходим к проверке достижения последнего элемента массива после обмена чисел | |
Подсчет суммы нечетных чисел | ||||
0890 |
01300A |
label21: |
lxi b,0a30h |
Загрузка начального адреса массива |
0893 |
210000 |
lxi h,0 |
Сумма нечетных элементов | |
0896 |
3AA00A |
lda 0aa0h |
Загрузка количества нечетных элементов в массиве | |
0899 |
57 |
mov d,a | ||
089A |
A7 |
ana a |
Если не найдено ни одного нечетного числа | |
089B |
CA |
jz ex |
То пропустить дальнейшие шаги | |
089C |
0A |
label31: |
ldax b |
Загрузка числа из исходного массива |
089D |
E680 |
ana a |
Проверка на знак | |
089F |
0A |
ldax b |
||
08A2 |
CAAE08 |
jnz label32 |
Если число положительное, переход на label12, если отрицательное – то следующая команда | |
08A5 |
85 |
add l |
Сложить значение из массива с младшим байтом суммы | |
08A6 |
6F |
mov l,a | ||
08A7 |
7C |
mov a,h |
Коррекция старшего байта для отрицательного элемента | |
08A8 |
CEFF |
aci 0ffh | ||
08AA |
67 |
mov h,a | ||
08AB |
C3B408 |
jmp label33 |
Продолжить цикл | |
08AE |
85 |
label32: |
add l |
Сложить значение из массива с младшим байтом суммы |
08AF |
6F |
mov l,a | ||
08B0 |
7C |
mov a,h |
Коррекция старшего байта для положительного элемента | |
08B1 |
CE00 |
aci 00 | ||
08B3 |
67 |
mov h,a | ||
08B4 |
03 |
label33: |
inx b |
Увеличиваем адрес для перехода к следующему элементу массива |
08B5 |
15 |
dcr d |
Уменьшаем количество оставшихся элементов массива | |
08B6 |
C29E08 |
jnz label31 |
Если не 0, переход на label31, иначе выполняем следующую команду | |
08B9 |
22F00A |
shld 0AF0h |
Сохраняем сумму нечетных элементов | |
Деление суммы на количество нечетных чисел | ||||
08BC |
3AF10A |
skip: |
lda 0af1h |
Загружаем старший байт результирующей суммы |
08BF |
E680 |
ani 80h |
Проверяем результат на отрицательность | |
08C1 |
CACF08 |
jz div1 | ||
08C4 |
3EFF |
mvi a,0ffh |
Сохраняем метку отрицательного результата | |
08C6 |
32F30A |
sta 0af3h | ||
08C9 |
21F00A |
lxi h,0af0h |
Выполняем подпрограмму смены знака числа | |
08CC |
CDFE08 |
call neg | ||
08CF |
0E00 |
div1: |
mvi c, 00 |
Очищаем промежуточное делимое перед началом деления |
08D1 |
3AA00A |
lda 0aa0h |
Загружаем делитель | |
08D4 |
57 |
mov d,a | ||
08D5 |
3AF10A |
lda 0AF1h |
Загружаем 1-й байт делимого | |
08D8 |
5F |
mov e,a | ||
08D9 |
CDFC08 |
call div |
Вызываем подпрограмму деления | |
08DC |
7C |
mov a, h |
Сохраняем 1-й байт результата | |
08DD |
32F90A |
sta 0AF9h | ||
08E0 |
3AF00A |
lda 0AF0h |
Загружаем 0-й байт делимого | |
08E3 |
5F |
mov e, a | ||
08E4 |
CD0A09 |
call div |
Вызываем подпрограмму деления | |
08E7 |
7C |
mov a, h |
Сохраняем 0-й байт результата | |
08E8 |
32F80A |
sta 0AF8h | ||
08EB |
79 |
mov a,c |
Сохраняем остаток от деления | |
08EC |
32F70A |
sta 0AF7h | ||
08EF |
3AF30A |
lda 0AF3h |
Проверяем наличие метки отрицательного результата и, если ее нет, то прекращаем выполнение программы, если есть – получаем обратный дополнительный код частного | |
08F2 |
FEFF |
cpi 0FFh | ||
08F4 |
C2FD08 |
jnz ex | ||
08F7 |
21F80A |
lxi h,0af8h |
Выполняем подпрограмму смены знака числа | |
08FA |
CDFE08 |
call neg | ||
08FD |
CF |
ex: |
rst 1 |
|
Смена знака 2-х байтного числа. В HL адрес числа | ||||
08FE |
7E |
neg: |
mov a,m |
Загружаем 0-й байт числа |
08FF |
2F |
cma |
Получаем прямой код 0-го (младшего) байта путем его инвертирования и прибавления 1 без учета флага переноса Tc | |
0900 |
C601 |
adi 01 | ||
0902 |
77 |
mov m,a |
Сохраняем младший байт числа | |
0903 |
23 |
inx h |
Адрес следующего байта числа | |
0904 |
7E |
mov a,m |
Загружаем 1-й байт числа | |
0905 |
2F |
cma |
Получаем прямой код 1-го байта путем его инвертирования и прибавления флага переноса Tc | |
0906 |
CE00 |
aci 00 | ||
0908 |
77 |
mov m,a |
Сохраняем старший байт числа | |
0909 |
C9 |
ret |
||
Процедура деления | ||||
090A |
210800 |
div: |
lxi h,0008 |
Загружаем счетчик битов в L и очищаем регистр частного H |
090D |
7B |
div3: |
mov a, e |
Загружаем делимое в аккумулятор |
090E |
17 |
ral |
Сдвигаем старший бит делимого в триггер переноса Tc | |
090F |
5А |
mov e, a |
Сохраняем результат в регистр делимого Е | |
0910 |
79 |
mov a, c |
Загружаем в аккумулятор промежуточное делимое из регистра С | |
0911 |
17 |
ral |
Сдвигаем триггер переноса Tc в младший бит промежуточного делимого | |
0912 |
92 |
sub d |
Вычитаем из промежуточного делимого делитель | |
0913 |
D21709 |
jnc div2 |
Если делитель больше промежуточного делимого (Tc=1), восстанавливаем промежуточное делимое путем прибавления делителя к разности | |
0916 |
82 |
add d | ||
0917 |
4F |
div2: |
mov c, a |
Сохраняем промежуточное делимое в регистр C |
0918 |
3F |
cmc |
Инвертируем триггер переноса Tc | |
0919 |
7C |
mov a, h |
Загружаем частное в аккумулятор | |
091A |
17 |
ral |
Сдвигаем триггер переноса Tc в младший бит регистра частного Н | |
091B |
67 |
mov h, a |
Сохраняем результат в регистр частного H | |
091C |
2D |
dcr l |
Проверяем отработаны ли все 8 битов | |
091D |
C2 0D09 |
jnz div3 | ||
0920 |
C9 |
ret |
||
0A00 |
0FF73007 B058C00B 09EF221A |
;Элементы массива | ||
Рисунок 1 – Очистка рабочих адресов
Рисунок 2 – Копирование исходных данных
Рисунок 2 – Выборка нечетных чисел из массива однобайтовых чисел
Рисунок 3 – Блок-схема алгоритма определения модуля однобайтовых чисел
Рисунок 4 – Сортировка однобайтовых чисел по возрастанию с учетом модуля
Рисунок 5 – Сложение элементов массива в двухбайтную сумму
Рисунок 6 – Деление с учетом знака двухбайтового числа на однобайтовое путем сдвига делимого
Рисунок 7 – Подпрограмма деления восьмибитных чисел без знака
Рисунок 8 – Подпрограмма смены знака
Рисунок 9 – Результат выполнения программы для тестового набора 1
Рисунок 10 – Результат выполнения программы для тестового набора 2 (отрицательный результат)
Рисунок 10 – Результат выполнения программы для тестового набора 3 (в наборе отсутствуют нечетные числа)
СПИСОК ЛИТЕРАТУРЫ
1. Палагута К.А. Микропроцессоры INTEL 8080, 8085 (КР580ВМ80А, КР1821М85А) и их программирование. – М.: МГИУ, 2007. – 104 с.
2. Микропроцессор К580ВМ80 и основы построения микро-ЭВМ с его применением: методические указания / Сост. Палагута К.А. – М.: МГИУ, 2006. – 59 с.
3. Микропроцессоры и интерфейсные средства: методические указания к выполнению курсовой работы / Сост. Кузнецов А.В., Палагута К.А. – М.: МГИУ, 2008. – 95 с.