МПС 3 курс Практические задания 06 Составление сложных программ на ассемблере - BysonHunter/Tavrich_college GitHub Wiki

🏠 Главная · Микропроцессорные системы · 3 курс · Практические работы по МДК.02.01 «Микропроцессорные системы»


Практическая работа №6

Составление сложных программ на языке ассемблера

Цель работы

Закрепить навыки разработки сложных программ для КР580ВМ80:

  • работа с массивами;
  • подпрограммы CALL/RET;
  • PUSH/POP;
  • многобайтовая арифметика;
  • учёт переноса CY;
  • маскирование и побитовые операции;
  • вывод данных через порт.

1. Теоретические сведения

Многобайтовое сложение

Для сложения младших байтов используется ADD, а для старших — ADC, чтобы учитывать перенос:

младшие байты: ADD
старшие байты: ADC

Многобайтовое вычитание

младшие байты: SUB
старшие байты: SBB

Подпрограммы

CALL SUBROUTINE
...

SUBROUTINE:
    ; код
    RET

Сохранение регистров

PUSH B
...
POP B

Маскирование

ANI mask

2. Задание 1. Умножение массива на коэффициент

Исходный массив начинается с:

0050h

Коэффициент:

[004Ah]

Исправление неоднозначности

В исходной методичке не указано количество элементов массива. В этой версии вводится:

[004Bh] = N — количество элементов

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

0060h

Ограничение базового варианта

Чтобы результат каждого умножения оставался однобайтовым, принять:

исходный элемент: 0...50
коэффициент: 0...5

Если преподавателем задан больший коэффициент, необходимо отдельно обработать переполнение.

Требования

  1. Использовать подпрограмму умножения.
  2. Реализовать умножение повторяющимся сложением.
  3. Обработать N элементов.
  4. Не изменять исходный массив.

3. Задание 2. Годовая сумма продаж двух магазинов

Магазин 1:

0100h...010Bh

Магазин 2:

0110h...011Bh

Каждый элемент: 1...255.

Максимальная сумма за 12 месяцев:

12 × 255 = 3060 = 0BF4h

Поэтому сумма должна быть двухбайтовой.

Адреса результатов

В исходной методичке адреса результатов не заданы. Для однозначности использовать:

0120h — магазин 1, младший байт
0121h — магазин 1, старший байт

0122h — магазин 2, младший байт
0123h — магазин 2, старший байт

0124h — общая сумма, младший байт
0125h — общая сумма, старший байт

Требования

  • обработать 12 элементов каждого массива;
  • учитывать CY;
  • общую сумму вычислить как 16-битное число.

4. Задание 3. Сумма пяти двухбайтовых чисел

Пять 16-битных чисел занимают 10 байт:

0050h...0059h

Исправление размера результата

Максимальный результат:

5 × 65535 = 327675 = 04FFFBh

Это значение требует трёх байтов.

Результат сохранить:

0060h — младший байт
0061h — средний байт
0062h — старший байт

Требования

  1. Сложить младшие байты.
  2. Сложить старшие байты с ADC.
  3. Накопить перенос в третьем байте.
  4. Проверить крайний случай FFFFh × 5.

5. Задание 4. Выделение 3-го и 5-го битов

Исходное число:

[0050h]

В исходнике указаны маски:

00000100b = 04h
00010000b = 10h

Уточнение нумерации

Эти маски соответствуют:

  • 3-му биту от младшего разряда, если считать биты как 1,2,3,...;
  • в стандартной нумерации с нуля — битам 2 и 4.

Использовать:

маска 3-го бита = 04h
маска 5-го бита = 10h

Результаты

Для однозначности записать:

[0051h] = 00h или 01h — значение 3-го бита
[0052h] = 00h или 01h — значение 5-го бита

После ANI при необходимости нормализовать результат до 0/1.


6. Задание 5. Вывод Ф.И.О. и группы

Вывести на виртуальный монитор:

ФАМИЛИЯ ИМЯ
ГРУППА 3КСК27

или номер своей группы.

Начать с 5-й строки и разместить текст по центру.

Уточнение по кодировке

Старый эмулятор может не поддерживать Unicode/UTF-8. Используйте кодовую таблицу, которую поддерживает конкретный монитор КР580. Если кириллица отсутствует, по согласованию с преподавателем используйте латинскую транслитерацию.

Центрирование

Если текстовый экран имеет ширину 39 символов, стартовую позицию можно определить как:

Xstart = floor((39 - L) / 2)

где L — длина строки.

Способ позиционирования зависит от протокола монитора конкретной версии эмулятора.


7. Рекомендуемая организация подпрограмм

Полезно выделить подпрограммы:

ADD16
MUL8
PRINT_CHAR
PRINT_STRING
GET_BIT

Для каждой подпрограммы определить:

  • входные регистры;
  • выходные регистры;
  • какие регистры изменяются;
  • какие сохраняются через PUSH/POP.

8. Таблица тестирования

Задание Тест Исходные данные Ожидаемо Получено Статус
1 1
1 2
2 1
3 1
4 1
5 1

9. Содержание отчёта

  1. Титульный лист.
  2. Цель.
  3. Краткие теоретические сведения.
  4. Листинги всех программ.
  5. Скриншоты выполнения.
  6. Таблицы тестирования.
  7. Анализ переполнений и корректности.
  8. Вывод.

← Практическая работа №5 · дополнительно →

Оригинал материала на GitHub