Лаб. Занятие 6. Обязательные задания для решения в классе
Требуемые условия завершения
Лаб. Занятие 6. Обязательная задача [3 балла]
Открыто с: понедельник, 7 октября 2024, 08:00
Срок сдачи: пятница, 11 октября 2024, 13:30
Лаб. Занятие 6. Обязательная задача [3 балла]
Следует разместить в Moodle решение одной из перечисленных ниже задач (по выбору преподавателя)
Во всех заданиях следует в основной программе вызвать написанную функцию (или процедуру), полученный результат (результаты) вывести на консоль и завершить основную программу соответствующим системным вызовом (аналогично тому, как было описано в Лаб3). Если не указано иначе, то все функции и процедуры следует писать, используя конвенции вызова cdecl.
-
[
61.s
] Создайте процедуру конкатенации (слияния) двух строк в формате .ASCIZconcatenate(str1, str2, con_str)
Аргументы - адреса исходных строкstr1
,str2
и адрес буфера для объединенной строкиcon_str
. Обратите внимание, что все строки должны быть в формате .ASCIZ. Для определенности будем считать, что объединенная строка не длиннее 255 символов..SECT .BSS con_str: .SPACE 255
-
[
62.s
] Создайте функциюLAST_5(str)
для нахождения номера последнего символа '5' в строке, адрес которой передается параметром в функцию. Строка в формате .ASCIZ. Если символ '5' ни разу не встречается в строке, то в регистре AX по завершению функции должно быть значение -1. Указание: использовать проход от конца строки к началу. -
[
63.s
] Создайте процедуруFILTER_DIG
, которая принимает в качестве аргументов две строки и предикат. Она записывает во вторую строку все символы из первой, удовлетворяющие данному предикату. Указания: использовать инструкцииLODS/STOS
и передачу функций в функции, которая обсуждалась на занятии 4 (часть 3). В основной программе сделайте демонстрацию вызова — с предикатом проверки на то, что очередной символ является цифрой (0-9), т. е. в результате работы функции вторая строка должна включать только цифры.
В основной программе вызвать функцию для строки " Если 5<x, то повторять цикл 15 раз, иначе 20" и распечатать на консоль результат. -
[
64.s
] Создайте функциюEQ_3
, которая подсчитывает количество элементов массива, равных трём. Используйте при создании функции подходящие цепочечные инструкции. В качестве параметров функции передаётся адрес начала массива и его длина. В основной программе вызовите функцию для массива {9, 3, 11, 12, 3, 45} и распечатайте на консоль результат. -
[
65.s
] Создайте процедуру преобразования строки в формате .ASCIZ по следующему правилу все строчные английские буквы должны быть заменены заглавными. Аргумент процедуры - адрес исходной строкиstr
. Обратите внимание, что коды строчных английских букв в таблице кодов ACSII расположены последовательно и лежат в диапазоне 97-122, а все заглавные буквы имеют коды 65-90 и также расположены последовательно в таблице кодов. Используйте для создания функции подходящие цепочечные инструкции. -
[
66.s
] Создайте функциюCMP_STR
, которая получает на вход адреса двух строкstr1
,str2
в формате .ASCIZ и возвращает в регистре AX значение -1, если строкаstr2
не входит в строкуstr1
, в остальных вариантах в AX должно быть значение смещения (номер позиции) с которого строкаstr2
входит в строкуstr1
. -
[
67.s
] Создайте функциюCOUNT_STR
, которая получает на вход адреса двух строкstr1
,str2
в формате .ASCIZ и возвращает в регистре AX значение -1, если строкаstr2
не входит в строкуstr1
, в остальных вариантах в AX должно быть количество вхождений строкиstr2
в строкуstr1
c учетом возможных пересечений. Обратите внимание, что, к примеру, для строк "AAABBBCCC" и "BB" функция должна вернуть значение 2. -
[
68.s
] Создайте процедуру преобразования строки в формате .ASCIZ по следующему правилу - все слова в исходной строке должны начинаться с заглавной английской буквы, т. е. строчные английские буквы в начале слов должны быть заменены заглавными. Словом будем называть последовательность английских букв, начинающуюся с буквы и заканчивающуюся символом пробел (' ') или нулём (строки в формате .ASCIZ!). Аргумент процедуры - адрес исходной строкиstr
. Обратите внимание, что коды строчных английских букв расположены последовательно и лежат в диапазоне 97-122, а все заглавные буквы имеют коды 65-90 и также расположены последовательно в таблице кодов ASCII. Используйте для создания функции подходящие цепочечные инструкции. -
[
69.s
] Создайте процедуруSWAP_STR
, которая меняет местами строки по двум заданным адресам. В качестве параметров функции передаются адреса двух строк. Строки равной длины в формате .ASCIZ. В основной программе (ни в сегменте .DATA ни в сегменте .BSS) нельзя выделять память-буфер для временного хранения строки. Используйте для реализации подходящие цепочечные инструкции. Выведите на консоль значения этих строк до вызова процедуры и после вызова. -
[
6a.s
] Создайте процедуру преобразования строки в формате .ASCIZconc_rev(str, conсrev_str)
. Преобразование строки должно состоять в следующем - в полученной строке должна быть размещена исходная строка (без завершающего нуля), а затем её зеркальное отображение (символы исходной строки в обратном порядке). Результирующая строка должна быть в формате .ASCIZ. Аргументы процедуры - адрес исходной строкиstr
и адрес буфера для объединенной строкиconcrev_str
. Для определенности будем считать, что объединенная строка не длиннее 255 символов..SECT .BSS concrev_str: .SPACE 255
-
[
6b.s
] Создайте функциюALL_5(str)
для нахождения смещения вхождения символа '5' в строке, адрес которой передается параметром в функцию. Строка в формате .ASCIZ. Если символ '5' ни разу не встречается в строке, то в регистре AX по завершению функции должно быть значение -1. В основной программе распечатайте все смещения (номера) указанного символа в строке. -
[
6c.s
] Создайте процедуруFILTER
, которая принимает в качестве аргументов два адреса массивов и предикат. Она записывает во второй массив все числа из первого, удовлетворяющие данному предикату. Указания: использовать инструкцииLODS/STOS
и передачу функций в функции, которая обсуждалась на занятии 4 (часть 3). В основной программе сделайте демонстрацию вызова — с предикатом проверки на то, число состоит из 3-х значащих цифр (0-9), т. е. в результате работы функцииFILTER
второй массив должен включать только трехзначные положительные или отрицательные числа. -
[
6d.s
] Создайте функциюPRINT_WORDS
, которая разделяет строку на слова и распечатывает их по одному в строке на экране. Словом будем называть последовательность любых символов, начинающуюся с заглавной английской буквы (удобно использовать для сравнения 'A' и 'Z'. Например CMP DL,'A') и заканчивающуюся символом пробел (' '). Используйте при создании функции подходящие цепочечные инструкции (к примеру REPNE SCASB). Для облегчения решения будем полагать, что последнее слово также заканчивается пробелом. В качестве параметров функции передаётся адрес строки. В основной программе вызовите функцию для строки
и распечатайте на консоль результат. Обратите внимание, что с точки зрения определения слова на экран должны быть выведены следующие последовательностиstr: .ASCIZ "12 AB C45 ab34 ZER "
AB
C45
ZER -
[
6e.s
] Создайте процедуру преобразования строки в формате .ASCIZ по следующему правилу все заглавные английские буквы должны быть заменены строчными. Аргумент процедуры - адрес исходной строкиstr
. Обратите внимание, что коды строчных английских букв в таблице кодов ACSII расположены последовательно и лежат в диапазоне 97-122, а все заглавные буквы имеют коды 65-90 и также расположены последовательно в таблице кодов. Используйте для создания функции подходящие цепочечные инструкции. -
[
6f.s
] Создайте функциюCMP_STR
, которая получает на вход адреса двух строкstr1
,str2
в формате .ASCIZ и возвращает в регистре AX значение -1, если строкаstr2
не входит в строкуstr1
, в остальных вариантах в AX должно быть значение смещения (номер позиции) с которого строкаstr2
входит в строкуstr1
. Для простоты будем считать что строкаstr2
входит в строкуstr1
не более одного раза. Используйте для реализации подходящие цепочечные инструкции. -
[
6g.s
] Создайте функциюCOUNT_STR
, которая получает на вход адреса двух строкstr1
,str2
в формате .ASCIZ и возвращает в регистре AX значение -1, если строкаstr2
не входит в строкуstr1
, в остальных вариантах в AX должно быть количество вхождений строкиstr2
в строкуstr1
без учета пересечений, т.е. для строк "ABCX AAAABC YZ" и "AA" функция должна вернуть значение 2. -
[
6h.s
] Создайте процедуру преобразования строки в формате .ASCIZ по следующему правилу - все слова в исходной строке должны начинаться с заглавной английской буквы, т. е. строчные английские буквы в начале слов должны быть заменены заглавными. Словом будем называть последовательность английских букв, начинающуюся со строчной английской буквы и заканчивающуюся символом пробел (' '). Аргумент процедуры - адрес исходной строкиstr
. Обратите внимание, что коды строчных английских букв расположены последовательно и лежат в диапазоне 97-122, а все заглавные буквы имеют коды 65-90 и также расположены последовательно в таблице кодов ASCII. Используйте для создания функции подходящие цепочечные инструкции. -
[
6i.s
] Создайте процедуруSWAP_STR
, которая меняет местами строки по двум заданным адресам. В качестве параметров функции передаются адреса двух строк. Исходные строки в формате .ASCIZ и имеют равную длину. В основной программе (ни в сегменте .DATA ни в сегменте .BSS) нельзя выделять память-буфер для временного хранения строки. Используйте для реализации подходящие цепочечные инструкции. Выведите на консоль значения этих строк до вызова процедуры и после вызова.