EXERSISE (Ассемблер - упражнения), страница 5
Описание файла
Файл "EXERSISE" внутри архива находится в папке "Ассемблер - упражнения". Текстовый-файл из архива "Ассемблер - упражнения", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр 5 страницы текстового-файла онлайн
Вычислить значение этой формулы. (Пример: ((5-2)+7) --> 10)
б) Для ввода задана последовательность символов, представляющая собой
(без ошибок) формулу следующего вида:
<формула> ::= <цифра> | m(<формула>,<формула>) | m(<формула>,<формула>)
<цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
где m трактуется как max (максимум), а m - как min (минимум).
Вычислить значение этой формулы. (Пример: m(2,m(5,7)) --> 5)
Глава 9. ПРОЦЕДУРЫ.
Дальние безусловные переходы. Описание процедур, команды call и ret. Пе-
редача параметров (по значению и по адресу) через регистры. Передача па-
раметров через стек, "входные" и "выходные" действия процедуры. Локальные
данные процедуры. Реализация рекурсивных процедур.
УПРАЖНЕНИЯ.
9.1 Описать программу, которая вводит 4 положительных числа и опреде-
ляет их наибольший общий делитель.
В программе описать и использовать процедуру нахождения наибольшего
общего делителя двух чисел (эти числа-параметры передавать через регист-
ры) при условии, что:
а) в программе должен быть только один сегмент команд,
б) процедура должна быть описана в отдельно сегменте команд.
9.2 Используя из операций ввода только операцию inch, описать проце-
дуру inbyte, которая вводит десятичное число от 0 до 255 (число задано
без ошибок, за ним следует пробел) и присваивает его байтовой переменной,
адрес (смещение в сегменте данных) которой передается процедуре через ре-
гистр bx.
9.3 Описать процедуру negative, которой через регистр bx передается
адрес некоторой переменной (из сегмента данных) размером в двойное слово
и которая меняет ее значение на противоположное (меняет знак).
Используя эту процедуру, выписать фрагмент программы, в котором меня-
ются знаки у переменных x, y и z, имеющих размер двойного слова.
9.4 date struc ;тип "дата"
d db ? ;день
m db ? ;месяц
y dw ? ;год
date ends
Описать процедуру less, которая сравнивает две даты типа date, адрес пер-
вой их которых передается через регистр si, а адрес второй - через di, и
которая возвращает через регистр al свой ответ: 1, если первая дата пред-
шествует второй, и 0 иначе.
9.5 Описать процедуру outarr, осуществляющую вывод байтового массива,
чей начальный адрес передается через регистр bx, а количество элементов -
через регистр cx. Используя эту процедуру, выписать фрагмент программы
для решения следующей задачи: если последний элемент 60-байтового массива
a равен среднему элементу 101-байтовому массиву b, тогда вывести массив
a, иначе вывести массив b.
9.6 Описать подходящую процедуру и, используя ее, выписать фрагмент
программы для решения следующей задачи.
Имеются массивы x[0..59], y[0..22] и z[0..89] из знаковых чисел-слов.
Требуется заменить максимальный элемент массива x на последний элемент
массива y и заменить все элементы массива z, предшествующие его макси-
мальному элементу, на максимальный элемент массива z. (Считать, что в ка-
ждом массиве только один максимальный элемент.)
9.7 Описать процедуру f(x,n,p), подсчитывающую количество элементов
массива x из n слов, равных числу p, при условии, что адрес x передается
через регистр bx, число n - через cx, число p - через al, а результат
процедуры возвращается через регистр al.
Использовать эту процедуру для вычисления
k:=f(a,70,f(b,30,k))
где a - массив из 70 слов, b - массив из 30 слов, а k - байтовая перемен-
ная.
9.8 Описать дальнюю процедуру sign, которая определяет знак своего
параметра (выдает 1 при положительном параметре, 0 при нулевом и -1 при
отрицательном), при условии, что результат процедура возвращает через ре-
гистр al, а параметр ей передается (по значению) через стек.
Процедуру описать в двух вариантах:
а) размер параметра - слово,
б) размер параметра - байт.
9.9 Описать близкую процедуру setabs, которой через стек передается
адрес (смещение в сегменте данных) некоторой знаковой байтовой переменной
и которая заменяет ее значение на абсолютную величину.
Использовать эту процедуру для решения следующей задачи: a и b -
знаковые байтовые переменные; при a>b заменить на абсолютную величину
значение переменной b, иначе - переменной a.
9.10 Описать дальнюю процедуру zero от 20 параметров, которые переда-
ются через стек и каждый из которых представляет собой адрес некоторой
байтовой переменной (из сегмента данных). Процедура должна обнулить те из
этих переменных, значения которых положительны.
9.11 Описать близкую процедуру, которая определяет, есть ли в задан-
ном байтовом массиве хотя бы два равных элемента, при условии, что пара-
метры (начальный адрес массива и число элементов в нем) передаются через
стек.
Использовать эту процедуру для решения следующей задачи: если в мас-
сиве x из 400 байтов есть повторяющиеся элементы, а в массиве y из 60
байтов все элементы различны, тогда в регистр al записать 1, а иначе за-
писать 0.
9.12 Используя из операций вывода только операцию outch, описать
дальнюю процедуру outw, которая выводит в десятичном виде и без незнача-
щих нулей беззнаковое число размером в слово, переданное процедуре:
а) через регистр ax,
б) через стек.
Процедура должна выделять десятичные цифры числа справа налево и вре-
менно сохранять их в массиве, место под который отводится в стеке.
9.13 Описать близкую процедуру, которая за один просмотр заданного
байтового массива циклически сдвигает его элементы на заданное число по-
зиций вперед, при условии, что параметры для процедуры (способ передачи
параметров - через регистры или стек - выбрать самим). В своей работе
процедура должна использовать вспомогательный массив, отведя место для
него в стеке.
Использовать эту процедуру для решения следующей задачи: элементы
300-байтового массива x циклически сдвинуть на 40 позиций вперед, а эле-
менты 80-байтового массива y - на 15 позиций.
9.14 Для каждой из байтовых переменных a и b вывести строку вида
<адрес>:<содержимое>
где <адрес> - это адрес (смещение в сегменте данных) переменной в виде
четырехзначного шестнадцатиричного числа, а <содержимое> - значение пере-
менной в виде двузначного шестнадцатиричного числа (например: 01a8:f5).
При решении этой задачи описать и использовать следующие процедуры:
- вывод числа от 0 до 15 в шестнадцатиричном виде,
- вывод байта в виде двух шестнадцатиричных цифр,
- вывод строки указанного вида для одной переменной.
9.15 Описать программу, которая в цикле вводит приказы указанных ниже
типов и тут же выполняет их. (Считать, что приказы задаются без ошибок.)
Возможные приказы:
s seg:ofs. - напечатать в шестнадцатиричном виде (4 цифры) слово,
абсолютный адрес которого определяется парой seg:ofs
(номер сегмента : смещение);
l seg:ofs=w. - в слово памяти, абсолютный адрес которого задан парой
seg:ofs, записать новое значение w;
e. - завершить работу программы.
Здесь seg, ofs и w - шестнадцатиричные числа (от 1 до 4 цифр), причем
"буквенные" цифры могут быть записаны как большими (от a до f), так и ма-
лыми (от a до f) латинскими буквами.
9.16 Для ввода задана последовательность положительных чисел, за ко-
торой следует 0. Описать рекурсивную процедуру reverse, которая вводит
эти числа и выводит их (без 0) в обратном порядке.
9.17 Описать рекурсивную процедуру c, вычисляющую биномиальный коэф-
фициент c(m,n), где 0<=m<=n, по следующей формуле:
| 1 при m=0 или m=n
c(m,n) = {
| c(m,n-1)+c(m-1,n-1) при 0<m<n