Комиссия (19.09.26)
Лабораторная №1 (2 балла)
Напишите программу, которая вычисляет значение выражения 8x2 – 16x + x % 7 для первых пяти членов арифметической прогрессии с начальным значением x = 3 и шагом 3 и последовательно записывает в массив res (в секции неинициализированных данных). Для умножения на 8 и 16 используйте битовый сдвиг.
Лабораторная 2 (3 балла)
Напишите программу, которая суммирует все нечётные значения массива. Для проверки чётности используйте деление на 2 с помощью SHR. Результат (сумма элементов) остаётся в регистре AX. Массив задан в сегменте данных.
Лабораторная 3 (3 балла)
Создайте функцию PRINT_REVERSE, которая выводит на консоль элементы стека в обратном порядке. В качестве параметров функции передаётся количество значений N и адрес массива. В основной программе загрузите на стек адрес массива, описанного в секции инициализированных данных {9, 10, 11, 12} и его размер.
Лабораторная 4 (3 балла)
Создайте функцию AVG_10S, которая находит среднее значение значения, кратных 10 (в порядке их следования в стеке). В качестве параметров функции через стек передаются значения массива и их количество. В основной программе загрузите на стек массив {5, 10, 15, 20, 100, 18, 54} и его размер и вызовите написанную функцию. Результат выводите в основной программе.
Лабораторная 5 (3 балла)
Напишите программу, которая создаёт бинарный файл целых чисел deg2.dat, записывая в него первые 10 чисел геометрической прогрессии со знаменателем 3 (Напоминание, знаменателем прогрессии называется множитель, на который домножается предыдущий элемент при вычислении очередного). Считайте, что первый элемент прогрессии равен 1.
Лабораторная 6 (3 балла)
Разработайте микропрограмму для новой инструкции INC_7 [предлагаемый код: 0x16], которая увеличивает слово на вершине стека на 7.
Лабораторная 7 (3 балла)
Разработайте микропрограмму для реализации инструкции MAXAB. Код для инструкции подберите самостоятельно. Вместо лежащих на стеке значений ... , a , b на вершине стека должен быть b, если a<b, и a в противном случае (... , a < b ? b : a).
Лабораторная 8 (2 балла)
- Создайте каталог `work` и перейдите в него. Создайте в каталоге 3 файла. Для одного файла измените права доступа: удалите права чтения у всех, владельца, группы владельца и остальных. У другого файла добавьте права доступа на запись и выполнение для группы владельца, а у третьего добавьте те же права, но для остальных пользователей.
- Вернитесь в домашний каталог. Удалите `work` вместе со всеми файлами рекурсивно. Определите абсолютный путь к своему домашнему каталогу.
- С помощью цикла запишите в файл латинский алфавит.
- Определите, сколько файлов в системе принадлежит текущему пользователю(find, wc).
- Выведите справочную информацию о том, как использовать команду passwd. Найдите в файле /etc/passwd строку, отвечающую Вашему логину, и объясните значение каждого столбца.
- Сохраните в текстовом файле календарь летних месяцев прошлого года.
Лабораторная 9 (3 балла)
Написать сценарий, который принимает несколько путей к файлам как аргументы и должен проверить, что все они существуют и являются файлам. Если это не так, необходимо вывести сообщение об ошибке. В противном случае необходимо найти и вывести на консоль самую длинную строку в файле. Если сценарий запущен без аргументов, он должен вывести сообщение об использовании сценария.
Лабораторная 10 (5 баллов)
Напишите программу, которая получает в качестве аргументов несколько имен файлов и для каждого файла определяющую самую длинную строку в заданном файле. Если таких строк несколько, то в качестве результата выдать первую из них. Каждый файл должен обрабатываться в отдельном потоке. По окончании обработки следует выводить результаты на стандартный поток вывода. Проверьте работу написанных программ для следующих файлов.
Лабораторная 11 (5 баллов)
Реализовать две программы, одна из которых генерирует последовательность целых чисел:
xi = [A sin (ω i)] ∀ i = 0, 1, ..., T
для заданных A, ω и T. (Здесь квадратные скобки обозначают операцию округления). После генерирования очередной порции данных программа записывает их в буфер ограниченного размера и дожидается, пока другая программа не прочитает их оттуда. Вторая программа после получения очередной порции данных должна выводить их на печать.
Лабораторная 12 (5 баллов)
Напишите программу взаимодействия двух процессов через один именованный канал. Первый процесс посылает по каналу fifo1 второму сгенерированное сообщение длины N символов, второй процесс первому по тому же каналу – отправляет инвертированное полученное сообщение, т. е. символы сообщения идут в противоположном порядке от последнего к первому. Каждый из процессов выводит на стандартный поток вывода полученное сообщение. Взаимодействие продолжается, пока в терминале не будет указана команда kill -9 для соответствующих процессов. Рекомендация - поставьте небольшую задержку после вывода числа в stdout.
Дополнительные задания
-
[10 баллов] Создайте функцию
SUM_DIG, которая подсчитывает сумму цифр составляющих число. В качестве параметра функции передаётся обрабатываемое число. Создайте процедуруMAP, которая получает в качестве параметров через стек длину массива, адреса двух массивов одинаковой длины и функцию, которую она применяет к каждому элементу первого массива. Результат применения функции записывается в соответствующий элемент второго массива. В основной программе вызовите процедуруMAPдля исходного массива {90, 120, 411, 172}, массива для результатов и функцииSUM_DIG. Массив для результатов такого же размера следует объявить в секции неинициализированных данных. После вызова процедуры следует распечатать на консоль массив результатов. -
[10 баллов] Реализуйте на языке микроассемблера MAL инструкцию DUP_XYZ Код для инструкции подберите самостоятельно. Для работы инструкции положить на стек три числа v1, v2, v3. Инструкция должна менять содержимое стека следующим образом: значение v1, должно замениться на сумму трех величин v1+v2+v3, значение v2, должно замениться на разность трех величин v1-v2-v3, значение v3, должно замениться на v1+v2 - v3 Т.е. если до инструкции стек имел вид ....s , v1, v2, v3 (v3- значение, лежащее на вершине стека) то после выполнения DUP_XYZ стек должен иметь вид ...s, v1+v2+v3, v1-v2-v3, v1+v2 - v3.
-
[10 баллов] Написать программу на языке C, которая использует потоки и разделяемую память для подсчета частоты символов в заданной строке. Программа должна разбивать строку на несколько частей, каждая из которых обрабатывается отдельным потоком.– Создайте структуру, которая будет содержать:▪ Указатель на строку.▪ Два целых числа: индекс начала и индекс конца части строки, которую будет обрабатывать поток.▪ Массив для хранения частоты символов.– Используйте shmget и shmat для создания и подключения к разделяемой памяти, где будет храниться общий массив частоты символов.– Используйте библиотеку pthread для создания нескольких потоков (например, 4 потока).– Каждый поток должен обрабатывать свою часть строки и обновлять общий массив частоты символов в разделяемой памяти.– Программа должна считывать строку из стандартного ввода.– Разделите строку на части, которые будут обрабатываться потоками.– Используйте мьютексы для синхронизации доступа к общему массиву частоты символов, чтобы избежать состояния гонки.– После завершения работы всех потоков, главный поток должен вывести частоту каждого символа.