TASK_ASM (1000388), страница 5

Файл №1000388 TASK_ASM (В.Н. Пильщиков - Упражнения по языку Ассемблера MASM) 5 страницаTASK_ASM (1000388) страница 52019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 5)

<пусто> ::=

<элемент> ::= <буква> | (<текст>) | [<текст>] | {<текст>}

<буква> ::= A | B

8. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ.

8.1 Используя, если надо, регистр AX как вспомогательный и считая, что флаг направления DF равен 0, описать через другие (не строковые) команды действие команды:

а) MOVSB б) CMPSB в) SCASB г) LODSB д) STOSB е) REP MOVSB

8.2 S DB 'abcde',0

T DB 'abxyz'

Считая, что строки S и T описаны в сегменте данных и что регистры DS и ES уже установлены на начало этого сегмента, определить значения регистров CX и BL и флага ZF после выполнения следующей группы команд:

а) CLD б) STD в) CLD г) CLD

LEA SI,S LEA SI,S+4 LEA DI,S LEA DI,S

LEA DI,T LEA DI,T+4 MOV CX,5 MOV CX,5

MOV CX,5 MOV CX,5 MOV AL,'e' MOV AL,'f'

REPE CMPSB REPNE CMPSB REPNE SCASB REPNE SCASB

MOV BL,[SI] MOV BL,[SI] MOV BL,ES:[DI] MOV BL,ES:[DI]

8.3 S DB 100 DUP(?) ; S[0..99] of char

T DB 100 DUP(?) ; T[0..99] of char

Рассматривая S и T как символьные строки фиксированной длины, описанные в сегменте данных, на начало которого уже установлены регистры DS и ES, и используя строковые команды, выписать фрагмент программы для решения следующей задачи.

а) Определить, со скольких пробелов начинается строка S, и записать ответ в регистр CL.

б) Определить, сколькими пробелами заканчивается строка S, и записать ответ в регистр CL.

в) Найти индекс (от 0 до 99) первого вхождения буквы 'Q' в строку S и записать ответ в регистр DI; если эта буква не входит в S, то в DI записать -1.

г) Заменить в строке S последнее вхождение буквы 'n' на букву 'N'.

д) Записать в регистр BH число вхождений символа '*' в строку S.

е) Определить, равны ли левая и правая половины строки S, и записать ответ 1 (равны) или 0 в регистр AL.

ж) Определить, входят ли первые 5 символов строки T в строку S как подстрока, и записать ответ 1 (входят) или 0 в регистр AL.

з) Заменить последние 10 символов строки S на 10 первых символов строки T.

и) Циклически сдвинуть элементы строки S на две позиции влево.

к) Если первая и вторая четверти строки S не равны, то заменить третью четверть на последнюю.

л) Переписать содержимое строки T в строку S с заменой всех пробелов на символ '*'.

м) В строке S заменить все пробелы на символ '*'.

н) В строке S заменить все большие латинские буквы на соответствующие малые.

о) Удалить из строки S все цифры, сдвинув к ее началу все остальные символы и дописав пробелы в ее конец.

8.4 Считая, что в программе на сегмент стека отведено 1000 байтов, и используя строковые команды, выписать фрагмент программы для решения следующей задачи: если в стеке нет ни одного нулевого байта, тогда переписать содержимое стека в область памяти, начинающейся с абсолютного адреса 12345h.

8.5 Не делая никаких предположений о кодировке букв русского алфавита и используя команду SCASB, описать близкую процедуру LOWRUS, которой через регистр AL передается некоторый символ и которая, если это большая русская буква, заменяет ее (в AL) на соответствующую малую русскую букву (иные символы не менять). Все данные, необходимые процедуре, описать в самой процедуре.

8.6 S DB 256 DUP(?) ; длина(S)255

T DB 101 DUP(?) ; длина(T)100

Рассматривая S и T как символьные строки переменной длины (с текущей длиной в начальном байте), размещенные в одном сегменте памяти, на начало которого уже установлены регистры DS и ES, и используя строковые команды, выписать фрагмент программы для решения следующей задачи.

а) В строке S оставить только первые 10 символов (не более).

б) Сделать значением S строку из 50 пробелов.

в) В строке S заменить все большие латинские буквы на соответствующие малые.

г) Удалить все пробелы в конце строки S.

д) Удалить все пробелы в начале строки S.

е) Если в строке S от 10 до 40 символов, то продублировать 10-й символ.

ж) Удалить из строки S все пробелы.

з) В конец строки S дописать символы строки T, отбросив при этом лишние (256-й и последующие) символы, если такие окажутся.

и) Сравнить строки S и T и записать ответ 1 (S>T), 0 (S=T) или -1 (S<T) в регистр AL.

к) Определить, является ли строка T подстрокой строки S, и записать ответ 1 (является) или 0 в регистр AL.

л) Удалить из строки S все вхождения подстроки T.

8.7 Описать указанные ниже процедуры при следующих условиях:

- все используемые строки - это строки переменной длины (с текущей длиной в начальном байте), их максимальная длина - 255, нумерация их символов начинается с 1;

- все параметры передаются через стек, причем порядок их записи в стек - слева направо;

- числовые параметры положительны и имеют размер слова;

- параметр-строка задается своим абсолютным начальным адресом в виде пары "сегмент : смещение" ("сегмент" записывается в стек первым).

Процедуры (len(S) означает текущую длину строки S):

а) copy(R,S,i,n) - в строку R переписываются n символов строки S начиная с i-го (старое значение R уничтожается); если i>len(S), то строка R становится пустой; при i+n-1>len(S) копируются все символы до конца S;

б) delete(S,i,n) - из строки S удаляются n символов начиная с i-го; при i>len(S) строка S не меняется; при i+n-1>len(S) удаляются все символы до конца S;

в) insert(SS,S,i) - строка SS вставляется в строку S между (i-1)-м и i-м символами; если i>len(S), то SS добавляется в конец S; если длина строки-результата больше 255, то все лишние (256-й и последующие) символы отбрасываются;

г) pos(SS,S) - это функция, которая определяет, входит ли строка SS в строку S как подстрока, и возвращает (через регистр AL) как свое значение номер той позиции строки S, с которой начинается первое вхождение SS в S; если SS не входит в S, тогда значение функции равно 0.

8.8 L DW ?

L1 DW ?

X DW 100 DUP(?)

Считая, что уже описаны константа NIL, тип NODE и процедуры NEW и DISPOSE, что регистр ES уже установлен на начало сегмента кучи и что значения L и L1 трактуются как ссылки на списки (возможно, пустые) из знаковых чисел-слов, выписать фрагмент программы для решения следующей задачи.

а) Определить число положительных элементов в списке L и записать это число в регистр AX.

б) Обнулить все отрицательные элементы списка L.

в) Если в списке L не менее двух элементов, то изменить знак у его предпоследнего элемента. (Рекомендация: хранить в двух модификаторах, например BX и SI, адреса текущего и предыдущего звеньев списка.)

г) Сравнить массив X и список L (равны ли последовательности их элементов?) и записать ответ 1 (равны) или 0 в регистр AL.

д) Сравнить списки L и L1 и записать ответ 1 (равны) или 0 в регистр AL.

е) Определить, есть ли в списке L равные элементы, и записать ответ 1 (есть) или 0 в регистр AL.

ж) По массиву X построить список L - из тех же элементов и в том же порядке. (Рекомендация: список строить от конца.)

з) Ввести непустую последовательность ненулевых чисел, за которой следует 0, и напечатать эти числа в обратном порядке.

и) Создать L1 - копию списка L.

к) В список L вставить нулевой элемент после первого отрицательного элемента, если такой есть.

л) В список L вставить нулевой элемент перед первым отрицательным элементом, если такой есть.

м) В списке L продублировать каждый положительный элемент.

н) Вставить между первым и вторым элементами непустого списка L копии всех элементов списка L1.

о) Удалить из непустого списка L его последний элемент.

п) Удалить из списка L первый нулевой элемент, если такой есть.

р) Перенести первый элемент непустого списка L в конец списка.

с) Перенести последний элемент непустого списка L в начало списка.

т) Удалить из списка L все его отрицательные элементы.

у) Уничтожить список L, освободив место, занимаемое его звеньями, и присвоить переменной L значение NIL.

ф) Удалить из списка L все элементы, которые входят в список L1.

8.9 Описать близкую рекурсивную процедуру, параметр (ссылка на список) для которой передается через регистр BX и которая возвращает ответ через регистр AX, для решения следующей задачи.

а) Найти последний элемент непустого списка.

б) Найти длину (число элементов) заданного списка.

в) Определить, входит ли заданное (в регистре AX) число в заданный список (ответ: 1 (входит) или 0).

г) Найти число отрицательных элементов в заданном списке.

д) Определить, есть ли в заданном списке хотя бы один отрицательный элемент (ответ: 1 (есть) или 0).

е) Найти максимальный элемент непустого заданного списка.

ж) Построить копию заданного списка.

з) Удалить из заданного списка первый нулевой элемент, если он есть.

и) Удалить из заданного списка все нулевые элементы.

8.10 Пусть для работы с двоичными (бинарными) деревьями используется куча, организованная по аналогии с кучей для (линейных) списков (есть константа NIL, на начало кучи постоянно указывает регистр ES и т.д.), но при этом вершины деревьев описываются следующим структурным типом:

NODE STRUC ; вершина дерева:

ELEM DW ? ; элемент (знаковое число)

LEFT DW ? ; ссылка на левое поддерево или NIL

RIGHT DW ? ; ссылка на правое поддерево или NIL

NODE ENDS

и процедуры NEW и DISPOSE работают с тремя соседними словами кучи.

Описать (рекурсивно или с использованием стека) близкую процедуру, которой через регистр BX передается ссылка на дерево (возможно, пустое) и которая свой ответ возвращает через регистр AX, для решения следующей задачи.

а) Найти сумму всех элементов заданного дерева.

б) Поменять знак у всех отрицательных элементов заданного дерева.

в) Найти максимальное значение элементов заданного непустого дерева.

г) Подсчитать число листьев в заданном дереве.

д) Найти максимальную глубину заданного непустого дерева (число ветвей в наиболее длинном пути).

е) Определить число вершин на N-м уровне заданного дерева, если число N (0) передается через регистр CX (считать, что корень находится на 0-м уровне).

ж) Скопировать заданное дерево.

з) Ввести непустую последовательность попарно различных положительных чисел, за которой следует 0, и построить из них дерево поиска (в нем слева от любой вершины находятся только меньшие числа, а справа - только большие).

и) Распечатать в порядке возрастания все элементы заданного дерева поиска (см. предыдущий пункт).

к) Из заданного непустого дерева удалить все листья.

9. МАКРОСРЕДСТВА.

9.1 Описать с помощью подходящего блока повторения решение следующей задачи:

а) записать в регистр AH сумму чисел из регистров AL, BL, CL и DH;

б) обнулить переменные A, B и C типа DWORD;

в) используя из операций вывода только операцию OUTCH, вывести (с кавычками) текст "A+B=B+A";

г) зарезервировать (с помощью директивы DB) место в памяти для 40 байтов, присвоив им в качестве начальных значений первые 40 нечетных чисел (1, 3, 5, ..., 79).

9.2 Выписать текст окончательной программы, который построит макрогенератор по следующему фрагменту исходной программы:

а) IRP C,<INC A,JE L> б) IRP W,<SW,< A,2>> в) N EQU 5

C MOV&W IRP OP,<N,%N,N%N>

ENDM ENDM ADD AX,OP

ENDM

г) IRP C,<K,LL,M> д) IRP T,<AB,C> е) IRPC CH,<! %">

C EQU C&C&CC IRPC U,T ADD AL,'&CH' ;код CH

DB 'C&C&CC' DW U,T&U,T&&U ENDM

ENDM ENDM

DW U,T&U

ENDM

9.3 Описать в виде указанных (слева) макросов указанные операции над двойными словами (X,Y и Z - переменные типа DWORD, L - метка):

DMOV X,Y : X:=Y

DADD X,Y,Z : X:=Y+Z

DSUB X,Y,Z : X:=Y-Z

DJNE X,Y,L : при XY перейти на L

9.4 Описать в виде макроса DEF X,T,N,V определение массива X из N величин V, тип которых задается параметром T: при T=B это тип BYTE, при T=W - тип WORD, при T=D - тип DWORD.

Выписать текст, который построит макрогенератор по следующему фрагменту исходной программы:

K EQU 4

DEF C,B,10,'*'

DEF W,W,K+1,<TYPE C>

DEF ,D,%K+1,%(TYPE W)

DEF A,B,1,<1,2,3>

9.5 Описать полную программу, которая вводит три числа H, M и S и проверяет, удовлетворяют ли они следующим условиям: 0H23, 0M,S59. Если нет, программа должна выдать сообщение об ошибке, а иначе, трактуя эти числа как час (H), минута (M) и секунда (S) некоторого момента суток, должна напечатать время суток, на 1 секунду большее (с учетом смены суток).

Определить и использовать в этой программе два макроса, один из которых проверяет условие aXb, а другой - увеличивает X на 1 и, если X>b, обнуляет X.

9.6 Описать в виде указанного (слева) макроса указанное действие над знаковыми числами размером в байт:

а) ABS R,X : R:=abs(X), где R - регистр, X - переменная

б) SUM X,N : AX:=сумма элементов массива X из N байтов (N>0)

в) MAX X,N : AL:=максимум элементов массива X из N байтов (N>0)

9.7 Описать в виде макроса указанную команду, предполагая, что ее нет в ПК (в качестве вспомогательных можно использовать регистры AX и BX):

а) PUSH X (X - переменная размером в слово);

б) POP X (X - переменная размером в слово);

в) CALL P (P - имя близкой процедуры);

г) RET N (близкий возврат);

д) LOOP L (L - метка);

9.8 X DW 1234h

A MACRO R,U

Характеристики

Тип файла
Документ
Размер
231 Kb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6392
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее