Курсовая работа: Разработка микропроцессорной системы
Программа для вычисления (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
Бесплатно скачать Курсовая работа: Разработка микропроцессорной системы
|