EXERSISE (Ассемблер - упражнения), страница 6
Описание файла
Файл "EXERSISE" внутри архива находится в папке "Ассемблер - упражнения". Текстовый-файл из архива "Ассемблер - упражнения", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр 6 страницы текстового-файла онлайн
Параметры n и m передаются процедуре через регистры ah и al соответс-
твенно, а свой ответ она возвращает через регистр bx.
9.18 Описать рекурсивную процедуру mm, которая вводит последователь-
ность символов, представляющую собой правильную запись формулы следующего
вида:
<формула> ::= <цифра> | m(<формула>,<формула>) |
m(<формула>,<формула>)
<цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
(m трактуется как максимум (max), а m - как минимум (min)), которая вы-
числяет значение этой формулы (как число) и присваивает его регистру al.
9.19 Описать программу, которая вводит текст вида
<формула> = <формула>
где
<формула> ::= <цифра> | (<формула> <знак> <формула>)
<цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<знак> ::= + | -
и которая определяет, равны ли значения двух указанных формул, и печатает
ответ ДА или НЕТ.
В программе описать и использовать рекурсивную процедуру, которая
вводит и вычисляет значение одной формулы.
9.20 Описать процедуру selfcopy без параметров, действие которой зак-
лючается в том, что она копирует саму себя (все относящиеся к ней машин-
ные коды) в область памяти, начинающуюся с абсолютного адреса 12345h.
Глава 10. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ.
Флаг направления df, команды std и cld. Строковые команды (cmps, scas,
movs, lods, stos). Префиксы повторения. Команды lds и les. Строки пере-
менной длины: представление и операции. Списки: представление и операции;
организация куч, реализация процедур new и dispose.
УПРАЖНЕНИЯ.
10.1 s db 100 dup(?)
Рассматривая s как 100-символьную строку фиксированной длины, размещенную
в сегменте памяти, на начало которого уже установлены регистры ds и es, и
используя строковые команды, выписать фрагменты программы для решения
следующих задач.
а) Подсчитать, сколькими пробелами оканчивается строка s; ответ запи-
сать в регистр al.
б) Определить индекс (при нумерации индексов от 1) первого вхождения
буквы 'q' в строку s и записать его в регистр di; если эта буква не вхо-
дит в s, то в di записать 0.
в) Записать в регистр bh число вхождений символа '*' в строку s.
г) В строке s заменить все пробелы на точку.
д) Циклически сдвинуть элементы строки s на две позиции влево.
е) Если левая и правая половины строки s не равны, заменить левую по-
ловину на правую.
ж) В строке s заменить большие латинские буквы на соответствующие ма-
лые.
10.2 s db 256 dup(?) ;длина(s)<=255
t db 101 dup(?) ;длина(t)<=100
Рассматривая s и t как символьные строки переменной длины (с текущей дли-
ной в начальном байте), размещенные в одном сегменте памяти, на начало
которого уже установлены регистры ds и es, и используя строковые команды,
выписать фрагменты программы для решения следующих задач.
а) Сделать значением s строку из 50 пробелов.
б) Удалить все пробелы в конце строки s.
в) Удалить все пробелы в начале строки s.
г) Удалить из строки s все пробелы.
д) Если в строке s от 10 до 40 символов, то удвоить ее 10-й символ.
е) В конец строки s дописать символы строки t, отбросив лишние (256-й
и последующие) символы, если такие окажутся.
ж) Сравнить строки s и t; если они равны, в регистр al записать 1, не
равны - записать 0.
з) Определить, является ли строка t подстрокой строки s; ответ 1 (яв-
ляется) или 0 записать в регистр al.
10.3 Описать процедуру deldig, удаляющую все цифры из строки перемен-
ной длины (с текущей длиной в начальном байте), абсолютный адрес начала
которой в виде пары seg:ofs передается через стек, причем часть seg запи-
сана в стек первой. (Рекомендация: воспользоваться командами lds и les.)
10.4 Считая, что уже описаны константа nil, тип node и процедуры new
и dispose, что регистр es уже установлен на начало сегмента кучи и что в
сегменте данный описана переменная-слово list, значение которой трактует-
ся как ссылка на список из знаковых чисел-слов, выписать фрагменты прог-
раммы для решения следующих задач.
а) Определить количество нулевых элементов в списке list и записать
ответ в регистр ax.
б) Если в списке list не менее двух элементов, то обнулить его пред-
последний элемент. (Рекомендация: хранить в двух модификаторах, например
bx и si, адреса текущего и предыдущего звеньев списка.)
в) Построить список list из 50 элементов - чисел от 1 до 50. (Реко-
мендация: список строить от конца.)
г) В список list вставить нулевой элемент после первого отрицательно-
го элемента.
д) В список list вставить нулевой элемент перед первым отрицательным
элементом.
е) Удалить из списка list первый нулевой элемент.
ж) Перенести первый элемент непустого списка list в конец списка.
з) Перенести последний элемент непустого списка list в начало списка.
и) Уничтожить список list, освободив место, занимаемое его эвеньями,
и присвоить переменной list значение nil.
к) Ввести непустую последовательность положительных чисел, за которой
следует 0, и определить, сколько раз в этой последовательности повторяет-
ся ее максимальный элемент, записав ответ в регистр ax (список, созданный
при решении этой задачи, в конце уничтожить).
л) Определить, есть ли в списке list хотя бы два равных элемента, и
записать ответ 1 (есть) или 0 в регистр al.
10.5 Очередью (queue) называется последовательность элементов, в ко-
торой добавление и удаление элементов производятся согласно следующему
правилу: новый элемент всегда добавляется в конец очереди, а первым из
очереди всегда удаляется ее начальный элемент. (Примеры очередей хорошо
известны из жизни.)
Очередь можно представить в виде списка, в котором элементы распола-
гаются в порядке их поступления в очередь. При этом желательно хранить
как ссылку на начало этого списка (отсюда будут удаляться элементы очере-
ди), так и ссылку на последнее звено списка (к нему будут добавляться но-
вые элементы). Зная эти две ссылки, можно считать, что известна и вся
очередь, поэтому формально очереди можно рассматривать как структуры сле-
дующего типа:
queue struc
first dw nil ;ссылка на начало очереди
last dw ? ;ссылка на конец очереди
queue ends
(в пустой очереди поле first равно nil, а поле last может быть любым).
Задать конкретную очередь - значит задать имя (адрес) переменной-структу-
ры (из сегмента данных) типа queue.
Считая, что в программе используется несколько очередей из элементов
размером в слово и что уже определены все средства для работы со списками
(см. предыдущее упражнение), описать в виде процедур следующие действия
над очередью (ее адрес передается через регистр bx):
- проверить, пуста ли очередь; ответ 1 (пуста) или 0 (не пуста) вер-
нуть через флаг нуля zf;
- очистить очередь (сделать ее пустой, освободив место, занимаемое ее
элементами);
- добавить в очередь новый элемент, заданный в регистре ax;
- удалить из очереди первый элемент и записать его в регистр ax (если
очередь пуста, сообщить от ошибке и прекратить выполнение программы).
Используя эти процедуры, решить следующую задачу: ввести заданную по-