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

Программа для вычисления (1) требует обращения к ОЗУ. Расположение данных в ОЗУ представлено в табл. 4.

Таблица 4. Использование ОЗУ

Адрес Переменная Примечание
1

8003: 8002:

8001: 8000

INT_SUM Интегральная сумма
2 8004 Sign Знаковая ячейка
3 8005 Number Ячейка номера
4 8007: 8006 PE Предыдущее значение (число со знаком)
5 8009: 8008 СE Текущее значение (число со знаком)
6 800B: 800A KP Модуль
7 800D: 800C KI Модуль
8 800F: 800D KD Модуль
WC (Workcell) – рабочие ячейки, необходимые для временного хранения результатов процедуры MUL16_16 и отдельных частей суммы (1). Далее записывается смещение относительно ячейки WC с адресом 8010.
9 8011: 8010 WC+1: WC+0 Множимое (блок 2: 1 на рис. 4): текущее значение , разность
10 8013: 8012 WC+3: WC+2 Множитель (блок 4: 3): коэффициент
11 none WC+4 Умерший товарищ
12 8015: 8014 WC+6: WC+5 Блок 1×3
13 8017: 8016 WC+8: WC+7 Блок 2×3
14 8019: 8018 WC+10: WC+9 Блок 1×4
15 801B: 801A WC+12: WC+11 Блок 2×4
16

801F:801E:

801D: 801C

WC+16: WC+15:

WC+14: WC+13

Результат умножения
17

8023: 8022:

8021: 8020

WC+20: WC+19:

WC+18: WC+17

Результат умножения и
18 9FFF ST_PT Вершина стека

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

Программно переполнение (результат (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
LXID, WC + 13 10 3
MVIB, 4 7 2
XRAA 4 1
LOOP2: LDAXD 7 1
ADCM 7 1
STAXD 7 1
DCRB 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

К-во Просмотров: 480
Бесплатно скачать Курсовая работа: Разработка микропроцессорной системы