Пильщиков В.Н. - Упражнения по языку ассемблера MASM (1110572), страница 2
Текст из файла (страница 2)
3.11 Пусть A, B и C - знаковые переменные-слова. Записать в регистр DL значение 3, 2, 1 или 0 в зависимости от того, может ли существовать треугольник с такими длинами сторон (и если да, то какого он вида - равносторонний (3), равнобедренный (2) или какой-то иной (1)) или не может (0).
3.12 Пусть N - переменная-слово (N1), а K - переменная-байт. Определить, является ли N степенью числа 3 (1, 3, 9, 27, ...). Если является, то в K записать показатель степени (N=3k), не является - записать -1.
3.13 N DB ? ; N≥1
F DW ?
Записать в F:
а) N-е число Фибоначчи (FN);
б) первое из чисел Фибоначчи, превосходящих 10000.
(Определение чисел Фибоначчи Fk: F0=F1=1, Fk=Fk-1+Fk-2.)
3.14 Пусть N и K - переменные-слова и 2<K<N. Записать в регистр BX наибольший из остатков от деления N на числа 2, 3, ..., K.
3.15 N DW ? ; N≥0
Записать в регистр CL:
а) наибольшую цифру из десятичной записи числа N;
б) количество значащих цифр из десятичной записи числа N;
в) сумму цифр из десятичной записи числа N.
3.16 X DD ? ; X≥0
Записать в регистр CL старшую (левую) значащую цифру из десятичной записи числа X.
3.17 N DW ? ; N>1
Определить, является ли N простым числом. Ответ - 1 (да) или 0 - записать в регистр BL.
3.18 N DW ? ; N>1
Записать в регистр BL количество различных простых делителей числа N.
3.19 Z DB ?
Записать в Z максимальное значение выражения (X2+Y2) mod 80 в целочисленных точках квадрата 0≤X≤99, 0≤Y≤99.
3.20 R DB ? ; 0<R<150
Записать в регистр DX количество целочисленных точек на плоскости, попадающих в круг радиуса R с центром в начале координат.
Замечание. В упражнениях 3.21-3.32 решение задачи описать в виде фрагмента программы с вводом-выводом, используя вспомогательные операции INCH, ININT, FLUSH, OUTCH, OUTINT, OUTWORD, OUTSTR и NEWLINE. Считать, что все вводимые числа "укладываются" в размер слова.
3.21 Дана последовательность из 130 попарно различных знаковых чисел. Определить наибольшее из них и его порядковый номер в последовательности.
3.22 Дана последовательность символов (отличных от точки), за которой следует точка. Определить, сбалансирована ли эта последовательность по круглым скобкам. Ответ: ДА или НЕТ.
3.23 Напечатать таблицу умножения (в десятичной системе счисления).
3.24 Дан текст следующего вида:
d1 ± d2 ± ... ± dk .
где di - цифра от 0 до 9, k≥1. Найти значение этой алгебраической суммы.
3.25 Используя только операцию OUTCH, вывести содержимое регистра AX в виде:
а) знакового десятичного числа,
б) беззнакового 16-ричного числа ("буквенные" цифры - от A до F).
3.26 Используя только операцию INCH, ввести:
а) знаковое десятичное число,
б) беззнаковое 16-ричное число ("буквенные" цифры - от A до F)
и записать его в регистр AX. Считать, что число записано без ошибок, оканчивается пробелом и "укладывается" в размер слова.
3.27 Дано 50 чисел, среди которых есть по крайней мере одно отрицательное. Найти наибольшее среди отрицательных чисел.
3.28 Дана последовательность из 40 чисел. Определить, у скольких чисел этой последовательности равные "соседи" (т.е. равны предыдущее и последующее числа).
3.29 Дана непустая последовательность символов (отличных от точки), за которой следует точка. Напечатать эту же последовательность:
а) заменив все 'PH' на 'F';
б) удалив все лишние пробелы (т.е. из нескольких подряд идущих пробелов оставить только один) .
3.30 Дана непустая последовательность непустых слов из больших латинских букв; между соседними словами - запятая, за последним словом - точка. Подсчитать количество слов, которые:
а) начинаются с буквы 'S';
б) оканчиваются буквой 'Z';
в) начинаются и оканчиваются одной и той же буквой.
3.31 P DW ? ; P0
Q DW ? ; Q>0
Напечатать дробь P/Q в виде вещественного числа с 5 цифрами в дробной части.
3.32 X DD ?
Напечатать значение X в виде беззнакового десятичного числа. (Обратить особое внимание на возможность переполнения в команде DIV.)
4. ИНДЕКСИРОВАНИЕ. МАССИВЫ. СТРУКТУРЫ.
4.1 X DW 500h, 600h, 700h
Пусть BX=8000h и SI=102h. Указать (в форме X+число) исполнительный адрес следующей команды:
а) DEC X+2 б) DEC X[2] в) DEC [X+2] г) DEC [X]+2
д) INC X[SI] е) INC X[SI+2] ж) INC X[SI]-2 з) INC X-2[SI]
и) NEG X[BX][SI] к) NEG X[BX+SI] л) NEG X[BX+SI+8000h]
4.2 Пусть X - имя некоторого байта памяти и BX=i и пусть требуется обнулить байт памяти с адресом X+2*i. Определить, какой из следующих фрагментов правильно решает эту задачу:
а) MOV X[BX+BX],0 б) MOV DI,BX в) ADD BX,BX
MOV X[BX+DI],0 MOV X[BX],0
4.3 Пусть X - имя некоторого байта памяти и BX=i и пусть требуется обнулить байт памяти с адресом X-i. Определить, какой из следующих фрагментов правильно решает эту задачу:
а) MOV X[-BX],0 б) MOV [X-BX],0 в) NEG BX
MOV X[BX],0
4.4 X DW 0,1,2
Пусть X обозначает ячейку памяти с адресом 100. Указать числовые значения регистров AX и BX после выполнения следующих команд:
а) MOV AX,X б) MOV AX,X+2 в) MOV SI,2 г) LEA SI,X
LEA BX,X LEA BX,X+2 MOV AX,X[SI] MOV AX,2[SI]
LEA BX,X[SI] LEA BX,2[SI]
4.5 С помощью одной команды LEA реализовать следующее действие:
а) увеличить значение регистра BX на 10;
б) уменьшить значение регистра BX на 10;
в) записать в регистр AX значение регистра DI;
г) записать в регистр SI значение регистра BX, увеличенное на 1.
4.6 X DB 400 DUP(?)
Y DW 400 DUP(?)
Определить, какая величина должна находиться в регистре BX, чтобы выражение X[BX] определяло адрес 20-го от начала элемента массива X, если нумерация элементов этого массива начинается с:
а) 0 б) 1 в) 10 г) -10
Ответить на аналогичные вопросы для массива Y и выражения Y[BX].
4.7 Z DB 61 DUP(?) ; Z[0..60]
Пусть в регистре BX находится величина i, а в регистре DI - величина j (10i,j30). Указать адресные выражения, с помощью которых можно сослаться на элемент массива Z с индексом:
а) i б) i-10 в) j+10 г) j+i-1 д) 42 е) 0
4.8 X DB ?
Y DW ?
Указать, какие из следующих конструкций являются допустимыми формами записи операндов команд, а какие - нет и почему.
а) X[SI-1] б) X[1-BX] в) Y[DI]-2 г) 2-Y[DI]
д) BX[AX] е) AX[BX] ж) SI+2 з) X[BH]
и) [X] к) [5] л) X[5] м) 5[X]
н) [Y-X] о) Y-X[DI] п) X-Y[BX] р) X+Y[SI]
с) X[BX]+2[SI] т) X[SI]+2[DI ] у) [DI]X ф) Y[DI]
4.9 X DB 50 DUP(?) ; X[0..49]
Пусть в регистре BX находится адрес некоторого элемента массива X (т.е. X+i, где i - число от 0 до 49). Требуется в этом же регистре получить индекс (i) этого элемента. Определить, какая из следующих групп команд правильно решает эту задачу:
а) SUB BX,X б) SUB BX,[X] в) LEA AX,X г) LEA BX,-X[BX]
SUB BX,AX
4.10 Описать подходящий массив и, используя команду XLAT, решить следующую задачу: в регистре DH находится число от 2 до 19; требуется записать 1 в регистр AL, если число DH простое, и записать 0 иначе.
4.11 Q DB 256 DUP(?) ; Q[0..255] of 0..255
Считая, что в регистре AL находится число i от 0 до 255, реализовать присваивание Q[Q[i]]:=i.
4.12 X DW 100 DUP(?) ; числа со знаком
Решить следующую задачу:
а) записать в регистр AX число нулевых элементов массива X;
б) записать в регистр AX наименьший элемент массива X;
в) обнулить все отрицательные элементы массива X;
г) заменить на 1 первый нулевой элемент массива X;
д) изменить знак у первого элемента массива X, отличного от 1.
4.13 N EQU 100
Y DB N DUP(?) ; Y[0..N-1]
Считая, что все элементы массива Y неотрицательны и попарно различны, поменять местами наибольший и 20-й элементы этого массива.
4.14 Z DW 30 DUP(?) ; Z[0..29], числа со знаком
Решить следующую задачу:
а) обнулить последний положительный элемент массива Z;
б) если во второй половине массива Z есть элементы, равные 1, то первый из них заменить на 45;
в) поменять знак у всех элементов массива Z с четными индексами.
4.15 X DW 100 DUP(?)
Решить следующую задачу:
а) определить, у скольких элементов массива X равные соседи (предыдущий и последующий элементы), и записать ответ в регистр AL;
б) элементы массива X циклически сдвинуть на 2 позиции вправо;
в) если левая и правая половины массива X совпадают, то обнулить последний элемент этого массива.
4.16 S DB 200 DUP(?)
T DB 200 DUP(?)
Рассматривая S и T как символьные массивы (строки), решить следующую задачу:
а) все цифры строки S записать в начало строки T, а остальные символы - в конец (в любом порядке);
б) проверить на равенство строки S и T при условии, что пробелы не учитываются, и записать ответ 1 (равны) или 0 в регистр AL;
в) перенести в конец строки S все ее пробелы, сохранив взаимный порядок следования остальных символов;
г) определить, есть ли в строке S хотя бы два одинаковых символа, и записать ответ 1 (есть) или 0 в регистр AL.
4.17 LW DB 150 DUP(12 DUP(?))
Рассматривая LW как массив из 150 слов по 12 символов в каждом, решить следующие задачи:
а) подсчитать количество симметричных слов в этом массиве и записать ответ в регистр AL;
б) определить, упорядочены ли слова этого массива по алфавиту (по неубыванию), и записать ответ 1 (да) или 0 в регистр AL;
в) определить, есть ли в массиве LW хотя бы два одинаковых слова, и записать ответ 1 (есть) или 0 в регистр AL.
4.18 N DW ? ; 0N9999
S DB 4 DUP(?) ; символьная строка из цифр
Требуется:
а) записать в S десятичные цифры N (например: N=304 S='0304');
б) решить обратную задачу.
4.19 A DD 40 DUP(?) ; числа без знака
Заменить начальный элемент массива A на максимальный элемент массива.
4.20 X DB 100 DUP(?) ; X[0..99]
Y DW 100 DUP(?) ; Y[0..99]
Решить следующую задачу:
а) заполнить массивы X и Y по правилу: X[i]:=i, Y[i]=i;
б) записать в регистр DH количество элементов массива X, для которых выполняется условие X[i]>i (считать X[i] числами без знака).
4.21 Для ввода задана непустая последовательность малых латинских букв, за которой следует точка. Используя подходящий вспомогательный массив, определить (ответ напечатать):
а) сколько различных букв входит в эту последовательность;
б) какая из букв чаще всего встречается в этой последовательности (если таких букв несколько, выбрать любую).
4.22 N EQU 1000
X DB N DUP(?)
K DW ? ; 0<K<N
Используя подходящий вспомогательный массив, циклически сдвинуть элементы массива X на K позиций влево.
4.23 Для ввода дана непустая последовательность символов (отличных от точки), за которой следует точка и в которой не более 1000 символов. Ввести эти символы и распечатать их в обратном порядке, удалив предварительно все большие гласные русские буквы (А, Е, И, О, У, Ы, Э, Ю, Я).
4.24 Пусть в регистрах SI и DI находятся начальные адреса двух (непересекающихся) областей памяти из 20 слов в каждой. Решить следующую задачу:
а) обнулить все слова первой из этих областей (SI);
б) записать в каждое слово первой области его адрес;
в) сравнить содержимое обеих областей и записать ответ 1 (равны) или 0 в регистр AL.
4.25 N EQU 100
X DB N DUP(?) ; числа со знаком
Y DB ?
Считая, что элементы массива X упорядочены по возрастанию, определить, есть ли в X элемент, равный Y, и записать ответ 1 (есть) или 0 а в регистр AX.
При решении задачи использовать метод бинарного поиска (деления пополам): сравнить Y со средним (или около него) элементом массива X; если они равны, то поиск закончить; если Y меньше (больше) среднего элемента, то далее рассматривать только левую (правую) половину массива, применив к ней этот же метод.
4.26 N EQU 100
X DW N DUP(?) ; числа со знаком
Упорядочить массив X по неубыванию (X1X2X3...), используя следующий метод сортировки:
а) сортировка выбором: найти максимальный элемент массива и переставить его с последним элементом; затем этот же метод применить ко всем элементам, кроме последнего (он уже находится на своем окончательном месте); и т.д.
б) сортировка обменом (метод пузырька): последовательно сравнивать пары соседних элементов массива (X1 с X2, X2 с X3 и т.д.) и, если первый элемент пары больше второго, то переставлять их; тем самым наибольший элемент окажется в конце массива; затем этот же метод применить ко всем элементам, кроме последнего; и т.д.
в) сортировка вставками: пусть первые k элементов уже упорядочены по неубыванию; взять (k+1)-й элемент и разместить его среди первых k элементов так, чтобы упорядоченными оказались уже k+1 первый элемент; этот метод применять при k от 1 до N-1.
4.27 DATE STRUC ; дата
Y DW 1997 ; год
M DB ? ; номер месяца
D DB ? ; число