Лаб. Занятие 4. Обязательные задания
Лаб. Занятие 4. Обязательная задача [3 балла]
Следует разместить в Moodle решение одной из перечисленных ниже задач (по выбору преподавателя).
Во всех заданиях следует в основной программе вызвать написанную функцию (или процедуру), полученный результат (результаты) вывести на консоль и завершить основную программу соответствующим системным вызовом (аналогично тому, как было описано в Лаб3). Если не указано иначе, то все функции и процедуры следует писать, используя конвенции вызова cdecl.
-
[
41.s
] Создайте функциюMIN(x, y)
для определения наименьшего из двух аргументов, которая использует конвенции вызова pascal. Указание: по условиям конвенции pascal возвращаемое значение передаётся через изменяемый параметр Result. Параметр Result является первым неявным аргументом функции, т. е. аргументы следует передавать через стек, как если бы функция имела видMIN(Result, x, y)
. Обратите внимание, что для выполнения конвенции pascal, вам понадобится использовать форму инструкцииret
с целочисленным операндом, указывающим количество снимаемых со стека байт для очистки стека от аргументов. В случае передачи трех параметров это будет командаRET 6 ! ~ SP+6
-
[
42.s
] Создайте функциюDIVIDES_2_TO_N
, которая в качестве аргументов принимает два целых числа, X и N и возвращает 1, если X делится на 2N и 0 в противном случае. Указание: в цикле из максимум N шагов следует делать сдвиг вправо на одну позицию и если взведён флаг переноса (carry), то завершать цикл вместе со всей функцией, возвращая результат 0; если цикл пройдёт все N шагов и этот флаг ни разу не взведётся, то результат равен 1. В основной программе организуйте вызов написанной функции для массива из 5 значений, описанного в секции инициализированных данных {20, 64, 32, 11, 14} и числа 3 вместо N. -
[
43.s
] Создайте функциюCOUNT_5_ENDED
, которая подсчитывает число элементов заданного массива, оканчивающихся на 5 (последнюю цифру числа можно найти с помощью взятия остатка от деления на 10). В качестве параметров функции передаётся адрес начала массива и его длина. В основной программе вызвать функцию для массива {5, 21, 15, 20, 35, 5, 10} и распечатать на консоль результат. -
[
44.s
] Создайте функциюMUL_5_ENDED
, которая подсчитывает произведение элементов заданного массива, оканчивающихся на 5 (последнюю цифру числа можно найти с помощью взятия остатка от деления на 10). В качестве параметров функции передаётся адрес начала массива и его длина. В основной программе вызвать функцию для массива {5, 21, 15, 20} и распечатать на консоль результат. -
[
45.s
] Создайте функциюMULTIPLES_3
, которая подсчитывает количество элементов массива, кратных трём. В качестве параметров функции передаётся адрес начала массива и его длина. В основной программе вызвать функцию для массива {9, 10, 11, 12} и распечатать на консоль результат. -
[
46.s
] Создайте функциюPRINT_EVENS_THEN_ODDS
, которая выводит на консоль элементы массива, сначала четные, потом нечетные (в порядке их следования в исходном массиве). В качестве параметров функции передаётся адрес начала массива и его длина. В основной программе вызвать функцию для массива {5, 10, 15, 20}. -
[
47.s
] Создайте функциюPRINT_REVERSE
, которая выводит на консоль элементы массива в обратном порядке. В качестве параметров функции передаётся адрес начала массива и его длина. В основной программе вызвать функцию для массива {9, 10, 11, 12}. -
[
48.s
] Создайте функциюSUM_GREATER_10
, которая подсчитывает сумму элементов массива, значения которых больше 10. В качестве параметров функции передаётся адрес начала массива и его длина. В основной программе вызвать функцию для массива {9, 10, 11, 12} и распечатать на консоль результат. -
[
49.s
] Создайте функциюSUM_MOD_5
, которая подсчитывает сумму остатков от деления элементов данного массива на 5. В качестве параметров функции передаётся адрес начала массива и его длина. Функция должна удовлетворять конвенциям cdecl. В основной программе вызвать функцию для массива {9, 10, 11, 12} и распечатать на консоль результат. -
[
4a.s
] Создайте функциюMAX(x, y)
для определения наибольшего из двух аргументов, которая использует конвенции вызова pascal. Указание: по условиям конвенции pascal возвращаемое значение максимума передаётся через изменяемый параметр Result. Параметр Result является первым неявным аргументом функции, т. е. аргументы следует передавать через стек, как если бы функция имела видMAX(Result, x, y)
. Обратите внимание, что для выполнения конвенции pascal, вам понадобится использовать форму инструкцииret
с целочисленным операндом, указывающим количество снимаемых со стека байт для очистки стека от аргументов. В случае передачи трех параметров это будет команда
RET 6 ! ~ SP+6
-
[
4b.s
] Создайте процедуруSWAP
, которая меняет местами значения по двум данным ей адресам. В качестве параметров функции передаются два адреса. В основной программе вызовите написанную процедуру для "переменных" N и M, объявленных в секции инициализированных данных и равных соответственно 20 и 30, Выведите на консоль значения этих "переменных" до вызова процедурыSWAP
и после вызова. -
[
4c.s
] Тема - переменное число параметров. Создайте функциюPRINT_EVENS
, которая выводит на консоль только четные значения (в порядке их следования в стеке, начиная с вершины). В качестве параметров функции через стек передаётся количество значений N и за ним значения. В основной программе загрузите на стек массив {5, 10, 15, 20, 18} и его размер и вызовите написанную функцию. -
[
4d.s
] Тема - переменное число параметров. Создайте функциюPRINT_REVERSE
, которая выводит на консоль элементы стека в обратном порядке. В качестве параметров функции передаётся количество значений N и сами значения. В основной программе загрузите на стек значения массива, описанного в секции инициализированных данных {9, 10, 11, 12} и размер массива. -
[
4e.s
] Тема - передача адресов подпрограмм. Создайте функциюSUM_DIG
, которая подсчитывает сумму цифр составляющих число. В качестве параметра функции передаётся обрабатываемое число. Создайте процедуруMAP
, которая получает в качестве параметров через стек длину массива, адреса двух массивов одинаковой длины и функцию, которую она применяет к каждому элементу первого массива. Результат применения функции записывается в соответствующий элемент второго массива. В основной программе вызовите процедуруMAP
для исходного массива {90, 120, 411, 172}, массива для результатов и функцииSUM_DIG
. Массив для результатов такого же размера следует объявить в секции неинициализированных данных. После вызова процедуры следует распечатать на консоль массив результатов. -
[
4f.s
] Тема - передача адресов подпрограмм. Создайте функциюF
, которая вычисляет значение многочлена по формуле 3x4 / 8 + x - 12. В качестве параметра функции передаётся значение x. Создайте процедуруMAP
, которая получает в качестве параметров через стек длину массива, адреса двух массивов одинаковой длины и функцию, которую она применяет к каждому элементу первого массива. Результат применения функции записывается в соответствующий элемент второго массива. В основной программе вызовите процедуруMAP
для исходного массива {3, 2, 1, 4}, массива для результатов и функцииF
. Массив для результатов такого же размера следует объявить в секции неинициализированных данных. После вызова процедуры следует распечатать на консоль массив результатов. -
[
4g.s
] Тема - переменное число параметров. Создайте функциюPRINT_ODDS
, которая выводит на консоль только нечетные значения (в порядке их следования в стеке, начиная с вершины). В качестве параметров функции через стек передаётся количество значений N и за ним значения. В основной программе загрузите на стек массив {5, 10, 15, 20, 18} и его размер и вызовите написанную функцию.