рефераты рефераты
Главная страница > Курсовая работа: Разработка микропроцессорной системы  
Курсовая работа: Разработка микропроцессорной системы
Главная страница
Банковское дело
Безопасность жизнедеятельности
Биология
Биржевое дело
Ботаника и сельское хоз-во
Бухгалтерский учет и аудит
География экономическая география
Геодезия
Геология
Госслужба
Гражданский процесс
Гражданское право
Иностранные языки лингвистика
Искусство
Историческая личность
История
История государства и права
История отечественного государства и права
История политичиских учений
История техники
История экономических учений
Биографии
Биология и химия
Издательское дело и полиграфия
Исторические личности
Краткое содержание произведений
Новейшая история политология
Остальные рефераты
Промышленность производство
психология педагогика
Коммуникации связь цифровые приборы и радиоэлектроника
Краеведение и этнография
Кулинария и продукты питания
Культура и искусство
Литература
Маркетинг реклама и торговля
Математика
Медицина
Реклама
Физика
Финансы
Химия
Экономическая теория
Юриспруденция
Юридическая наука
Компьютерные науки
Финансовые науки
Управленческие науки
Информатика программирование
Экономика
Архитектура
Банковское дело
Биржевое дело
Бухгалтерский учет и аудит
Валютные отношения
География
Кредитование
Инвестиции
Информатика
Кибернетика
Косметология
Наука и техника
Маркетинг
Культура и искусство
Менеджмент
Металлургия
Налогообложение
Предпринимательство
Радиоэлектроника
Страхование
Строительство
Схемотехника
Таможенная система
Сочинения по литературе и русскому языку
Теория организация
Теплотехника
Туризм
Управление
Форма поиска
Авторизация




 
Статистика
рефераты
Последние новости

Курсовая работа: Разработка микропроцессорной системы

Обработка переполнения

Программно переполнение (результат (1) превышает 32 бита) контролируется в трёх случаях:

·  на очередном шаге произошло переполнение интегральной суммы;

·  переполнение после сложения  и интегральной суммы;

·  переполнение при выполнении операции (1).

Результатом переполнения является следующая последовательность действий:

·  на выходе сигнал FFFFH;

·  обнуляется интегральная сумма.

При этом сам пользователь должен контролировать: чтобы разность двух соседних сигналов и  не превышала 216.

 

Исходный текст программы

Метка

Мнемокод

Тактов

Байт

Примечания

Задание констант

PRT_IN_LO = 00H
PRT_IN_HI = 01H Старший байт входного сигнала
KP_LO = 02H
KP_HI = 03H
KI_LO = 04H
KI_HI = 05H
KD_LO = 06H
KD_HI = 07H
PRT_OUT_HI = 08H
PRT_OUT_LO= 09H
ST_PT = 9FFFH Указатель стека

В соотвествии с табл. 4 также указываются значения:

Int_sum, Sign, Number, PE, CE, KP, KI, KD, WC – WC +13, WC + 17

Основная программа

ORG 0000H Программа начинается по адресу 0000H
JMP START 10 3
NOP 4 1
NOP 4 1
NOP 4 1
NOP 4 1
JMP INT 10 3
START: DI 4 1 Запрет прерываний

Запись значений коэффициентов (со знаками) в память

MVI A, 0 7 2 Обнуление ячейки SIGN
STA SIGN 13 3
IN KP_LO 10 2 Запись в ячейку с адресом KP значения младшего байта KP
LXI H, KP 10 3
STAX H 7 1
IN KP_HI 10 2 Запись в ячейку с адресом INT_SUM+9 значения старшего байта KP
INX H 5 1
STAX H 7 1
IN KI_LO 10 2 Занесение остальных значений коэффициентов в соответсвующие ячейки памяти, коэффициент KD располагается также в регистрах А: В
INX H 5 1
STAX H 7 1
IN KI_HI 10 2
INX H 5 1
STAX H 7 1
IN KD_LO 10 2
INX H 5 1
STAX H 7 1
IN KD_HI 10 2
INX H 5 1
STAX H 7 1

Определение знаков коэффициентов, выделения модулей и записи знаков в соответствующий бит знаковой ячейки

MVI D, 3 7 2 Загрузить в регистр D количество циклов
@@1: LDAX H 7 1 Запись текущего коэффициента в B: C, старший байт также остаётся в аккумуляторе.
MOV C, A 5 1
DCX H 5 1
LDAX H 7 1
MOV B, A 5 1
RAL 4 1 Занесение в признак переноса старшего бита
JNC POSNUM 17 3 Если старший бит = 0, то перейти к POSNUM (positive number) – не требуется уточнение знака и изменения знаковой ячейки
MOV A, B 5 1 Загрузка в аккумулятор младшего байта
XRI FFH 7 2 Дополнение до двух и прибавление единицы – выделение модуля.
ADI 1 7 2
MOV B, A 5 1 Сохранение младшего байта модуля в регистре В
MOV A, C 5 1 Помещение в аккумулятор старшего байта
XRI FFH 7 2 Дополнение до двух и учёт переноса.
ACI 0 7 2
MOV C, A 5 1 Поместить в регистр С старший байт модуля
XRA A 7 1 Сброс признака переноса
MOV E, D 5 1
MVI A, 1 7 2
@@2: RAL 4 1 Смещение единицы в соответствующий разряд и сохранение в регистре Е
DCX E 5 1
JNZ @@2 17 3

Итого @@2

156

MOV E, A 5 1
LDA SIGN 13 3 Загрузить в соответствующий бит ячейки SIGN – 1 (прямая адресация)
ADD E 4 1
STA SIGN 13 3
POSNUM: MOV M, C 7 1 Сохранить модуль коэффициента в соответсвующих ячейках.
DCX H 5 1
MOV M, B 7 1
DCX H 5 1 Уменьшить адрес на единицу – указатель на старший байт следующего коэффициента
DCX D 5 1 Уменьшить счётчик цикла
JNZ @@1 17 3 Если не обработаны все коэффициенты то перейти к @@1. По окончании в регистрах B: С содержится значение коэффициента KP.

Итого@@1

750

LXI SP, ST_PT 10 3 Установка вершины стека
EI 4 1 Разрешение прерываний
HLT 7 1 Ожидание прерывания

Итого(START)

939

129

Программа обработки прерывания

Выявление модуля и знака

INT: IN PRT_IN_LO 10 2 Загрузить значение в регистры В: С и в память
STA СE 13 3 СE+1: СE (число со знаком)
MOV C, A 5 1
IN PRT_IN_HI 10 2
STA СE+1 13 3
MOV B, A 5 1
LXI H, SIGN 10 3 Обнуление младшего бита SIGN
LDAX H 7 1
ANI 00001110B 7 2
STAX H 7 1
RAL 4 1

Проверка знака , операции аналогичны приведённым выше

JNC POSNUM2 17 3
MOV A, C 5 1
XRI FFH 7 2
ADI 0 7 2
MOV C, A 5 1
MOV A, B 5 1
XRI FFH 7 2
ACI 0 7 2
MOV B, A 5 1
LDAX H 7 1 Помещение в младший бит SIGN единицы
ADI 1 7 2
STAX H 7 1
LXI H, WC 10 3

Помещение значения в память WC+1: WC (модуль)

POSNUM2: MOV A, C 5 1
STAX H 7 1
INX H 5 1
MOV A, B 5 1
STAX H 7 1

Умножение

Запись коэффициента KP в ячейки памяти WC+3: WC +2

LDA KP 13 3
STA WC+2 13 3
LDA KP+1 13 3
STA WC+3 13 3
MVI A, 1 7 2 Запись в NUMBER значение 1 – идентификатор коэффициента KP
STA NUMBER 13 3
LXI H, WC + 13 10 3 Необходимый параметр процедуры – адрес младшего байта результата
CALL MUL16_16 4146 NONE

Умножение

MVI A, 2 7 2 Запись в NUMBER значение 2 – идентификатор коэффициента KI
LDA KI 13 3 (58 тактов, 12 байт) – (42 такта – 12 байт)
STA WC+2 13 3 Запись KI в ячейки множителя
LDA KI 13 3
STA WC+3 13 3
LXI H, WC + 17 10 3
CALL MUL16_16 4146 NONE

Увеличение интегральной суммы

LXI H, WC + 17 10 3 Инициализация указателей
LXI D, INT_SUM 10 3
MVI B, 4 7 2 Инициализация счётчика
XRA A 7 1 Сброс признака переноса
LOOP1: LDAX D 7 1 Загрузка первого операнда
ADC M 7 1 Сложение
STAX D 7 1 Запоминание операнда
DCR B 5 1 Декремент счётчика
JZ DONE1 17 3 Сложение закончено?
INX H 5 1 Переход к следующему байту
INX D 5 1
JMP LOOP1 10 3 Организация цикла

Итого LOOP1

252
DONE1:

JC GLUCK

17 3 При переносе перейти к обработке переполнения

Умножение

LDA WC 13 3

Загрузка в регистры B: C

MOV C, A 5 1
LDA WC+1 13 3
MOV B, A 5 1
LDA SIGN 13 3

Проверить знак

RAR 4 1
JNC POSNUM3 17 3
MOV A, C 5 1 Если знак отрицательный, то перевести в дополнительный код.
XRI FFH 7 2
ADI 0 7 2
MOV C, A 5 1
MOV A, B 5 1
XRI FFH 7 2
ACI 0 7 2
MOV B, A 5 1
POSNUM3: LXI H, PE 10 3 Загрузить предыдущее значение в регистры В: С
MOV A, C 5 1
ADD M 7 1
MOV C, A 5 1
INX H 5 1
MOV A, B 5 1
ADC M 7 1
MOV B, A 5 1
RAL 4 1 Запись в младший бит SIGN знака разности
MVI E, 11111110B 7 2
MOV A, E 5 1
ACI 0 7 2
MOV E, A 5 1
LDA SIGN 13 3
ANA E 4 1
STA SIGN 13 3
MOV A, B 5 1 Проверить ещё раз разность на перенос
RAL 4 1
JNC POSNUM4 17 3
MOV A, C 5 1 Далее процедура инвертирования знака
XRI FFH 7 2
ADI 0 7 2
MOV C, A 5 1
MOV A, B 5 1
XRI FFH 7 2
ACI 0 7 2
MOV B, A 5 1
POSNUM4: STA WC 13 3 Помещение разности в ячейку множимого
MOV C, A 5 1
STA WC+1 13 3
LDA KD 13 3 Помещение КD в ячейку множителя
STA WC+2 13 3
LDA KD+1 13 3
STA WC+3 13 3
LXI H, WC+17 10 3
CALL MUL16_16 4146 NONE

Сложение

LXI H, INT_SUM 10 3 Операция аналогичная увеличению интегральной суммы. Результат сложения в WC+16 – WC+13
LXI D, WC + 13 10 3
MVI B, 4 7 2
XRA A 4 1
LOOP2: LDAX D 7 1
ADC M 7 1
STAX D 7 1
DCR B 5 1
JZ DONE2 17 3
INX H 5 1
INX D 5 1
JMP LOOP2 10 3

Итого LOOP2

252
DONE2:

JC GLUCK

17 3

Вычисление (1)

LXI H, WC + 17 10 3 Операция аналогичная увеличению интегральной суммы
LXI D, WC + 13 10 3
MVI B, 4 7 2
XRA A 4 1
LOOP3: LDAX D 7 1
ADC M 7 1
STAX D 7 1
DCR B 5 1
JZ DONE3 17 3
INX H 5 1
INX D 5 1
JMP LOOP3 10 3

Итого LOOP3

252
DONE3: JNC GOOD 17 3 Если нет переноса, то пропустить обработку переполнения

Обработка переполнений

GLUCK:

MVI A, FFH 7 2 Запись в выдаваемые старшие два байта значения FFFFH
LXI H, WC + 15 10 3
MOV M, A 7 1
INX H 5 1
MOV M, A 7 1
LXI H, INT_SUM 10 3 Обнуление интегральной суммы
MVI B, 4 7 2
MVI A, 00H 7 2
LOOP4: STAX D 7 1
DCR B 5 1
JZ GOOD 17 3
INX D 5 1
JMP LOOP4 10 3

Итого LOOP4

176

Выдача результата

GOOD:

LDA WC + 15 13 3 Выдача старших шестнадцати бит суммы
OUT PRT_OUT_LO 10 2
LDA WC + 16 13 3
OUT PRT_OUT_HI 10 2
LDA CE 13 3 Текущее значение становится предыдущим.
STA PE 13 3
LDA CE+1 13 3
STA PE+1 13 3

RET

10

1

Итого RET

14444

293

Процедура умножения шестнадцатибитных чисел

MUL16_16:

Расположение в памяти исходных данных (4 байта):

Множимое – WC+1: WC

Множитель – WC+3: WC+2

Расположение результата (4 байта):

H-L – адрес младшего байта результата

Задействуются все регистры

 

PUSH H 11 3 Запомнить адрес младшего байта результата
LXI H, WC 10 3
LDAX H 7 1 Вычисление и помещение в память блока 1×3 (см. рис. 4 и табл. 4)
MOV E, A 5 1
INX H 5 1
INX H 5 1
LDAX H 7 1
MOV D, A 5 1
CALL MUL8_8 820 NONE
MOV A, С 5 1
STA WC + 5 13 3
MOV A, B 5 1
STA WC + 6 13 3
LDAX H 7 1 Вычисление и помещение в память блока 2×3 (см. рис. 4 и табл. 4)
MOV E, A 5 1
DCX H 5 1
LDAX H 7 1
MOV D, A 5 1
CALL MUL8_8 820 NONE
MOV A, С 5 1
STA WC + 7 13 3
MOV A, B 5 1
STA WC + 8 13 3
DCX H 5 1 Вычисление и помещение в память блока 1×4 (см. рис. 4 и табл. 4)
LDAX H 7 1
MOV E, A 5 1
INX H 5 1
INX H 5 1
INX H 5 1
LDAX H 7 1
MOV D, A 5 1
CALL MUL8_8 820 NONE
MOV A, С 5 1
STA WC + 9 13 3
MOV A, B 5 1
STA WC + 10 13 3
LDAX H 7 1 Вычисление и помещение в память блока 2×4 (см. рис. 4 и табл. 4)
MOV D, A 5 1
DCX H 5 1
DCX H 5 1
LDAX H 7 1
MOV E, A 5 1
CALL MUL8_8 820 NONE
MOV A, С 5 1
STA WC + 11 13 3
MOV A, B 5 1
STA WC + 12 13 3

Сложение промежуточных результатов

LXI H, WC + 6 10 3
LDAX H 7 1 Загрузить ячейку WC+6
MOV D, A 5 1
INX H 5 1
LDAX H 7 1 Загрузить ячейку WC+7
ADD D 4 1
MOV D, A 5 1
INX H 5 1
LDAX H 7 1 Загрузить ячейку WC+8
ACI 0 7 2 Прибавить перенос к третьему байту
MOV C, A 5 1
LDA WC+12 13 3
ACI 0 7 2 Прибавить перенос к четвёртому байту
MOV B, A 5 1
INX H 5 1
LDAX H 7 1 Загрузить ячейку WC+9
MOV E, A 5 1
MOV A, D 5 1
ADD E 4 1
MOV D, A 5 1 Регистр D содержит второй байт
MOV A, C 5 1
ACI 0 7 2 Прибавить перенос к третьему байту
MOV C, A 5 1
MOV A, B 5 1
ACI 0 7 2 Прибавить перенос к четвёртому байту
MOV B, A 5 1
INX H 5 1
LDAX H 7 1 Загрузить ячейку WC+10
ADD C 4 1
MOV C, A 5 1
MOV A, B 5 1
ACI 0 7 2 Прибавить перенос к четвёртому байту
MOV B, A 5 1
INX H 5 1
LDAX H 7 1 Загрузить ячейку WC+11
ADD C 4 1
MOV C, A 5 1 Регистр С содержит третий байт
MOV A, B 5 1
ACI 0 7 2 Прибавить перенос к четвёртому байту
MOV B, A 5 1 Регистр В содержит четвёртый байт
STA NUMBER 13 3 Загрузка в регистр Е содержимого ячейки памяти NUMBER, числа, которое определеняет, какой из коэффициентов является множителем
MOV E, A 5 1
STA SIGN 13 3 Загрузить ячейку знаков
RAR 4 1

Если знак первого сомножителя

был отрицательный, то регистр H содержит 1, если положительный – 0.

MVI A, 0 10 2
ACI 0 7 2
MOV H, A 5 1
@@3: RAR 4 1 Помещение значащего для этого коэффициента бита в признак переноса и последующее сложение с содержимым регистра H
DCR E 5 1
JNZ @@3 17 3

Итого @@3

78

MOV A, H 5 1
ACI 0 7 1
RAR 4 1 Сумма минусов чётная? Если нет, то необходимо инвертировать результат
JNC NO_INVER 17 3
STA WC + 5 13 3 Загрузить в аккумулятор первый байт произведения
XRI FFH 7 2
ADI 1 7 2
POP H 11 1 Вернуть значение H-L из стека
STAX H 7 1 Сохранить значение первого байта по указанному адресу
INX H 5 1
MOV A, D 5 1
XRI FFH 7 2
ACI 0 7 2
STAX H 7 1 Сохранить значение второго байта
INX H 5 1
MOV A, C 5 1
XRI FFH 7 2
ACI 0 7 2
STAX H 7 1 Сохранить значение третьего байта
INX H 5 1
MOV A, В 5 1
XRI FFH 7 2
ACI 0 7 2
STAX H 7 1 Сохранить значение четвёртого байта
NO_INVER:

RET

10

1

Конец процедуры

Итого MUL16_16

4135

168

MUL8_8:

Осуществляет умножение восьмибитных чисел

Множитель – Е

Множимое – D

Двухбайтный результат – BC Задействуется регистр: L

PUSH H 11 1 Сохранение значение регистровой пары H-L
LXI B, 0 10 3 Сброс частичной суммы
MVI L, 8 7 2 Загрузка счётчика
NEXT_BIT: MOV A, E 5 1 Множитель в аккумулятор
RAR 4 1 Поместить анализируемый бит в признак переноса
MOV E, A 5 1 Возврат сдвинутого множителя
JNC NO_ADD 17 3 Бит множителя равен нулю?
MOV A, B 5 1 Нет
ADD D 4 1 Прибавление множимого
MOV B, A 5 1 Возврат старшей частичной суммы
NO_ADD: MOV A, B 5 1
RAR 4 1 Сдвиг частичной суммы
MOV B, A 5 1
MOV A, C 5 1
RAR 4 1
MOV C, A 5 1 Возврат младшей частичной суммы
DCR L 5 1
JNZ NEXT_BIT 17 3 Организация цикла

Итого NEXT_BIT

760

POP H 11 1 Возвращение сохранённой регистровой пары H-L

RET

10

1

Конец процедуры умножения

Итого MUL8_8

809

27

Итого вся программа

15419

627

Страницы: 1, 2, 3, 4, 5

рефераты
Новости