Микропроцессоры и интерфейсные средства транспортных средств

Автор работы: Пользователь скрыл имя, 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

 

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 с.

 

 

 


Информация о работе Микропроцессоры и интерфейсные средства транспортных средств