Вы находитесь на странице: 1из 15

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ

ФЕДЕРАЦИИ
Федеральное государственное автономное образовательное учреждение высшего
образования
«Дальневосточный федеральный университет»
(ДВФУ)

Институт математики и компьютерных технологий


Департамент информационных и компьютерных систем

ОТЧЕТ
по лабораторной работе номер №8
по дисциплине «Архитектура вычислительных систем»
Тема: «Ассемблер»

Выполнил студент группы Б9122-


09.03.03пиэ
А. Р. Клименко

Проверил ст. преподаватель


Д. А. Бушко

зачтено/не зачтено

г. Владивосток
2023
Постановка задачи
Задание 1. Подключить к буферу ввода/вывода процессора
компонент «терминал» так, чтобы младшие семь битов буфера
интерпретировались как ASCII символы и выводились на терминал при
каждой записи в буфер. Написать на языке ассемблера подпрограмму,
которая принимает в качестве аргумента 32-битное беззнаковое целое
число и выводит его десятичное представление на новую строку
терминала. Продемонстрировать работоспособность подпрограммы,
вызвав её несколько раз с различными аргументами. Вызов подпрограммы
осуществляется с помощью инструкции jal, возврат из подпрограммы
— с помощью инструкции jr $ra, а аргументы передаются через
регистры $a0-$a3.
Задание 2. Подключить к младшим восьми битам
буфера
ввода/вывода компонент «Генератор случайных чисел», выдающий
случайные 8-битные значения при каждом чтении буфера. Написать на
языке ассемблера программу, которая считывает 60 таких случайных
значений, определённым образом обрабатывает их, а затем эти значения
и последовательность значений, полученных после обработки, выводит на
терминал, вызывая подпрограмму из задания 1. Алгоритм обработки
pначения разбиваются на последовательные пары, и для каждой пары
находится остаток от деления первого числа на второе. Результат
обработки — последовательность этих остатков, отсортированная по
возрастанию.
Задание 3. Подключить к двум буферам ввода/вывода процессора
компоненты «Клавиатура», и «Терминал». Написать на языке ассемблера
программу, выполняющую те же преобразования над вводимыми с
клавиатуры символами, что и в задании 7 лабораторной работы 7 (с учётом
вариантов). Результат обработки должен выводиться на терминал.
Задание 4. К двум буферам ввода/вывода подключить ещё один
компонент ОЗУ, который будет выполнять функции видеопамяти. Один
буфер хранит адрес для записи в видеопамять, а другой — записываемое
по этому адресу значение. К видеопамяти подключена светодиодная
матрица, изображение на которую выводится из видеопамяти с помощью
развёртки. Буферы и развёртка имеют раздельный доступ к видеопамяти
по нечётным тактам осуществляется запись из буферов, а по чётным
считывание значения развёрткой. Задача — написать на языке ассемблера
программу, управляющую записью значений в буферы вывода таким
образом, чтобы на светодиодной матрице поочерёдно формировались два
изображения — нормальное и негативное. Параметры матрицы и
изображение для вывода нужно взять те же, что и в задании 4
лабораторной работы 7.
Выполнение работы

Задание 1. Подключить к буферу ввода/вывода процессора


компонент «терминал» так, чтобы младшие семь битов буфера
интерпретировались как ASCII символы и выводились на терминал при
каждой записи в буфер. Написать на языке ассемблера подпрограмму,
которая принимает в качестве аргумента 32-битное беззнаковое целое
число и выводит его десятичное представление на новую строку
терминала. Продемонстрировать работоспособность подпрограммы,
вызвав её несколько раз с различными аргументами. Вызов подпрограммы
осуществляется с помощью инструкции jal, возврат из подпрограммы
— с помощью инструкции jr $ra, а аргументы передаются через
регистры $a0-$a3.
Для выполнения задания я выполнил следующие шаги:
Написал код на языке ассемблера для подпрограммы, которая
принимает десятичное представление 32-битного беззнакового целого числа,
и выводит его на новую строку терминала. Код подпрограммы приведен на
рисунке 1.
Рисунок 1 – Код подпрограммы.
Собранная схема представлена на рисунке 2.

Рисунок 2 – Схема для задания 1


Эта программа работает следующим образом:
1. Изначально проверяется изменилось ли значение в буфере 0, если
да, то переходив в метку print_integer если нет, то обратно в main
2. Дальше переходим в цикл loop_count и считываем сколько цифр в
числе.
3. Если счетчик равен одному, то мы выводим это число иначе идем
дальше
4. Дальше мы переходим в цикл loop_diff который при завершении
своей работы хранит в регистре $t3 число, на которое мы будем делить наше
значение.
5. Дальше идет вывод значения в цикле loop_print, после его
завершения мы возвращаемся в main.

Задание 2. Подключить к младшим восьми битам буфера


ввода/вывода компонент «Генератор случайных чисел», выдающий
случайные 8-битные значения при каждом чтении буфера. Написать на
языке ассемблера программу, которая считывает 60 таких случайных
значений, определённым образом обрабатывает их, а затем эти значения
и последовательность значений, полученных после обработки, выводит на
терминал, вызывая подпрограмму из задания 1. Алгоритм обработки
значения разбиваются на последовательные пары, и для каждой пары
находится остаток от деления первого числа на второе. Результат
обработки — последовательность этих остатков, отсортированная по
возрастанию.

Для выполнения задания я выполнил следующие шаги:


Написал код на языке ассемблера для подпрограммы, которая
сортирует остатки деления двух случайных чисел и выводит их в терминал.
Код подпрограммы приведен на рисунке 3.
Рисунок 3 – Часть кода из задания 2
Полученная схема представлена на рисунке 4.

Рисунок 4 – Схема из задания 2


Эта программа работает следующим образом:
1. Считывает два случайных значения из буфера 0, находит остаток
от деления первого на второго и записывает его в ОЗУ.
2. После заполнения ОЗУ тридцатью значениями начинается
сортировка.
3. Алгоритм сортировки пузырьком, если первый элемент больше
второго, то мы его меняем, и так пока не отсортируем все значения.
4. После сортировки переходим в вывод значения, разобранный в
первом задании.
Задание 3. Подключить к двум буферам ввода/вывода процессора
компоненты «Клавиатура», и «Терминал». Написать на языке ассемблера
программу, выполняющую те же преобразования над вводимыми с
клавиатуры символами, что и в задании 7 лабораторной работы 7 (с учётом
вариантов). Результат обработки должен выводиться на терминал.
Для выполнения задания я выполнил следующие шаги:
Написал код на языке ассемблера для подпрограммы, которая
принимает значение из буфера клавиатуры, и проходит проверку, если это
символ, то возвращаем 0, иначе тоже значение, которое было на входе. Код
подпрограммы приведен на рисунке 5.

Рисунок 5 – Код для 3 задания


Рисунок 6 – Схема из задания 3
Эта программа работает следующим образом:
Введенное число проходит ряд проверок, если число заключено в
определенный диапазон символа, то возвращаем 0, иначе возвращаем тоже
значение что и было на входе.
Задание 4. К двум буферам ввода/вывода подключить ещё один
компонент ОЗУ, который будет выполнять функции видеопамяти. Один
буфер хранит адрес для записи в видеопамять, а другой — записываемое
по этому адресу значение. К видеопамяти подключена светодиодная
матрица, изображение на которую выводится из видеопамяти с помощью
развёртки. Буферы и развёртка имеют раздельный доступ к видеопамяти
по нечётным тактам осуществляется запись из буферов, а по чётным
считывание значения развёрткой. Задача — написать на языке ассемблера
программу, управляющую записью значений в буферы вывода таким
образом, чтобы на светодиодной матрице поочерёдно формировались два
изображения — нормальное и негативное. Параметры матрицы и
изображение для вывода нужно взять те же, что и в задании 4
лабораторной работы 7.
Для выполнения этого задания выполнены следующе действия:
Написал код на языке ассемблера для подпрограммы, которая на
четных тактах принимает значение из ОЗУ, а на нечетных тактах выводит его
в матрицу. Код подпрограммы приведен на рисунке 5

Рисунок 7 – Код для задания 4


Собранная схема представлена на рисунке 8.
Рисунок 8 – Схема из задания 4
Эта программа работает следующим образом:
1. С начало загрузил в регистр $t0 максимальное значение, для
вывода негативного изображения.
2. В метке positive_print выводится изображения без изменений.
3. В метке negative_print выводится негативное изображение, то
есть все нули становятся единицами, а единицы нулями, достигается это
командой xor, максимального значения на значение, которое получили.
4. Когда адрес достигает значения 31 мы переходим на другую
метку вывода и т.д.
Вывод
В ходе данной лабораторной работы я познакомился с процессором
lilpM32 и изучил его инструкции. В процессе работы были выполнены
несколько программ, реализующих различные задачи.
Задание 1:
В этом задании я подключил к буферу ввода/вывода процессора
компонент "терминал". Написал подпрограмму на языке ассемблера, которая
принимает 32-битное беззнаковое целое число в качестве аргумента и
выводит его десятичное представление на новую строку терминала.
Продемонстрировал работоспособность подпрограммы, вызвав её несколько
раз с различными аргументами.
Задание 2:
В этом задании был подключен компонент "Генератор случайных
чисел", который выдает случайные 8-битные значения при каждом чтении
буфера. Написал программу, которая считывает 60 случайных значений,
обрабатывает их, и выводит как исходные, так и обработанные значения на
терминал, используя подпрограмму из первого задания.
Задание 3:
В данном задании были подключены к двум буферам ввода/вывода
процессора компоненты "Клавиатура" и "Терминал". Написал программу,
выполняющую те же преобразования над вводимыми с клавиатуры
символами, что и в предыдущих заданиях. Результат обработки выводится на
терминал.
Задание 4:
В последнем задании к двум буферам ввода/вывода был подключен
компонент ОЗУ, выполняющий функции видеопамяти. Реализовал
программу, управляющую записью значений в буферы вывода таким
образом, чтобы на светодиодной матрице поочередно формировались два
изображения - нормальное и негативное.
Лабораторная работа позволила мне более глубоко понять архитектуру
процессора lilpM32, ознакомиться с инструкциями и разработать программы
для различных задач. Это был полезный опыт, расширивший мои навыки
программирования на ассемблере.

Вам также может понравиться