TASKASM1 (1109490), страница 2
Текст из файла (страница 2)
а) Подсчитать количество симметричных слов в этом массиве. Ответ записать в регистр AL.
б) Определить, есть ли в массиве LW хотя бы два одинаковых слова, и
записать ответ 1 (есть) или 0 в регистр AL.
5.19 С помощью массива меток реализовать следующий оператор варианта
языка Паскаль (N - константа с неотрицательным значением, X и Y - знако-
вые байтовые переменные):
case N/8 of
1,4,5,7: y:=-y;
0,3: x:=y div 3;
2,6: y:=abs(x)
end
5.20 DATA STRUC ;дата
D DB 1 ;число
M DB ? ;номер месяца
WD DB 'воскресенье' ;день недели
DATA ENDS
Описать переменные D1, D2, D3 и D4 типа DATA со следующими начальными
значениями их полей (знак ? означает, что поле не должно иметь начального
значения):
D M WD
D1: 5 1 среда
D2: 1 5 воскресенье
D3: ? ? ?
D4: 1 ? воскресенье
Директивы, описывающие эти переменные, должны быть максимально короткими.
5.21 TIME STRUC ;время какого-то момента суток
H DB ? ;час (от 0 до 23)
M DB ? ;минута (от 0 до 59)
S DB ? ;секунда (от 0 до 59)
TIME ENDS
T TIME <>
T1 TIME <>
Присвоить переменной T1 время, на 1 секунду большее времени T. (Учесть
смену суток.)
5.22 PERSON STRUC ;информация о человеке
FAM DB 20 DUP(?) ;фамилия
NAM DB 10 DUP(?) ;имя
AGE DB ? ;возраст
PERSON ENDS
GR PERSON 40 DUP(<>) ;группа людей
F DB "Школьный",12 DUP(" ")
N DB 10 DUP(?)
Решить следующие задачи:
а) В регистр AL записать возраст самого старшего из людей группы GR.
б) Если среди людей из группы GR есть человек с фамилией, указанной в
переменной F, тогда в переменную N записать имя этого человека (любого,
если их несколько).
в) Если среди людей группы GR есть тезки (с одинаковыми именами), тог-
да любое из повторяющихся имен записать в переменную N.
5.23 Имеются символьные переменные S и T:
S DB 256 DUP(?) ;S[0..255]
T DB 80 DUP(?) ;T[0..79]
подстроки которых будем представлять структурами типа SUBSTR:
SUBSTR STRUC
ASTR DW ? ;начальный адрес строки, в которую входит подстрока
INDX DB ? ;индекс элемента строки, с которого начинается подстрока
LENG DB ? ;длина подстроки (число символов в ней)
(Например, директива X SUBSTR <T,59,20> описывает подстроку из последних
20 символов строки T.)
Имеются две подстроки:
A SUBSTR <>
B SUBSTR <>
которые в процессе выполнения программы получили некоторые значения (считаем, что эти значения корректно задают подстроки: подстрока не выходит
за пределы строки и т.п.).
Решить следующие задачи:
а) Если в подстроку A входит пробел, тогда сделать значением перемен-
ной B подстроку из 15 начальных символов строки S.
б) Если подстроки A и B равны (состоят из равного числа попарно равных
символов), тогда в регистр AL записать 1, а иначе 0.
Глава 6. БИТОВЫЕ ОПЕРАЦИИ. УПАКОВАННЫЕ ДАННЫЕ.
Логические команды (NOT, AND, TEST, OR, XOR), вычисление логических выражений. Команды сдвига (SHL, SHR, SAL, SAR, ROL, ROR, RCL, RCR), быстрое
умножение и деление на степени двойки. Упакованные данные, приемы их обработки. Множества: представление и операции. Записи: описание типов и
переменных, операторы WIDTH и MASM.
УПРАЖНЕНИЯ.
6.1 Пусть под логические переменные A и B выделено по байту:
A DB ?
B DB ?
и пусть выбрано следующее представление для логических значений: "ложь" -
нулевой байт, "истина" - любой ненулевой байт. Реализовать при этом представлении следующие операции:
а) A:=not A б) A:=A and B в) A:=A or B
6.2 X и Y - переменные-слова, значения которых рассматриваются как
числа без знака. Не используя команды умножения и деления, реализовать
следующие вычисления:
а) Y:=4*X - X div 8 + X mod 16
б) Y:=35*X
6.3 Не используя команды деления, вывести значение регистра AX в виде
4-значного шестнадцатеричного числа.
6.4 Не используя команды умножения, ввести шестнадцатеричное число и
записать его в регистр AX. Считать, что число записано без ошибок, содержит от 1 до 4 цифр ("буквенные" цифры заданы заглавными буквами), за которыми следует пробел.
6.5 X DD ? ;число со знаком
Реализовать вычисление AL=sign(X), т.е. в регистр AL записать 1 при X>0,
записать 0 при X=0 или записать -1 при X<0.
6.6 X DW ?
Подсчитать количество двоичный единиц в слове X. Ответ записать в AL.
6.7 Перевернуть содержимое регистра BH (например: 11001010b ->
01010011b).
6.8 TR RECORD A:3,B:2,C:3
R TR <>
Реализовать следующие операции (все поля - из переменной R):
а) полю A присвоить значение поля C;
б) поменять местами значения полей A и C;
в) перейти на метку EQ, если значения полей A и B равны.
6.9 DATE1 STRUC ;дата в виде структуры
D1 DB ? ;день (от 1 до 31)
M1 DB ? ;номер месяца (от 1 до 12)
Y1 DB ? ;год (две последние цифры - от 0 до 99)
DATE1 ENDS
DATE2 RECORD D2:5, M2:4, Y2:7 ;дата в виде записи
DT1 DATE1 <>
DT2 DATE2 <>
Решить следующие задачи:
а) Проверить на равенство даты DT1 и DT2 и записать в регистр AL зна-
чение 1, если даты равны, и значение 0 иначе.
б) Переменной DT2 присвоить дату, являющуюся значением DT1.
в) Переменной DT1 присвоить дату, являющуюся значением DT2.
6.10 DATE RECORD D:5, M:4, Y:7 ;дата в формате
;"день-месяц-год (две последние цифры)"
DATE1 RECORD Y1:5, M1:4, D1:7 ;дата в формате "год-месяц-день"
A DATE <>
B DATE <>
A1 DATE1 <>
Решить следующие задачи:
а) Вывести дату A в виде dd.mm.yy (например: 14.6.90).
б) Определить, предшествует ли дата A дате B, и записать ответ 1
(предшествует) или 0 в регистр AL.
в) Присвоить переменной A1 ту же дату, что записана в переменной A.
6.11 Имеются числовые константы L и R (L<R) и переменные
M DB (L-R)/8+1 DUP(?)
S DB (L-R)/8+1 DUP(?)
X DW ? ;L<=X<=K
Рассматривая M и S как множества целых чисел из отрезка [L,R], решить
следующие задачи:
а) Из множества M удалить все элементы, входящие в множество S.
б) В множество M добавить элемент X.
в) Из множества M удалить элемент X.
г) Определить, сколько элементов входит в множество M. Ответ записать
в регистр AL.
д) Вывести все числа, входящие в множество M.
е) Передать управление на метку SUBSET, если множество S является
подмножеством множества M.
6.12 Для массива X[0..511], элементами которого являются числа от 0
до 3, предложить машинное представление, наиболее экономное по расходу
памяти, и реализовать следующие операции:
а) перейти на метку LESS, если X[6]<X[197]
б) X[i]:=X[45], где i - значение регистра SI и 0<=i<=255.
в) элементы массива X циклически сдвинуть на одну позицию влево.
Глава 7. ПРОГРАММНЫЕ СЕГМЕНТЫ.
Сегментирование адресов в ПК, соглашения о сегментных регистрах. Программные сегменты. Операторы OFFSET и SEG, адресные переменные. Директива
ASSUME. Начальная загрузка сегментных регистров. Структура программы на
языке ассемблера. Директива INCLUDE.
УПРАЖНЕНИЯ.
7.1 ABS DD ?
PAIR DD ?
Значение переменной ABS трактуется как 20-разрядный абсолютный адрес не-
которой ячейки памяти, а значение переменной PAIR - как адрес этой же
ячейки, но заданный в виде адресной пары сегмент:смещение (seg:ofs), при-
чем в силу "перевернутого" представления двойных слов в памяти часть ofs
находится в первом слове этой переменной, а часть seg - во втором.
Не используя команды умножения и деления, решить следующие задачи:
а) преобразовать абсолютный адрес ABS в адресную пару PAIR;
б) преобразовать адресную пару PAIR в абсолютный адрес ABS;
в) нормализовать адресную пару PAIR, т.е. преобразовать ее к виду,
где смещение ofs не превосходит 15 (0Fh); например, пару 4567h:1112h надо
привести к виду 4678h:2h.
7.2 Пусть ES=4208h, BX=0FFF0h и OFFSET X=28Ah. Вычислить абсолютный
адрес второго операнда каждой из следующих команд.
а) MOV AX,ES:15h
б) CMP BX,ES:X
в) ADD CX,ES:[BX]
г) XOR DX,ES:X[BX+15h]
7.3 Пусть CS=1111h, DS=2222h, SS=3333h, BX=8000h, BP=8000h, SI=9003h.
Определить, какой сегментный регистр подразумевается по умолчанию в каж-
дой из следующих команд, и вычислить абсолютный адрес первого операнда
этих команд.
а) SUB [BX],CL
б) MOV [BP+2],DX
в) JMP WORD PTR [BX+SI]
г) JMP WORD PTR [BP+SI-4]
7.4 Пусть переменная D описана в сегменте D1, переменная E - в сегменте E1, а переменная S - в сегменте S1. Для последнего операнда каждой
из следующих команд определить, какой из префиксов (DS:, ES: или SS:) вы-
берет ассемблер при трансляции этого операнда, и определить, сохранит ли
ассемблер этот префикс при формировании соответствующей машинной команды.
ASSUME DS:D1, ES:E1, SS:S1
MOV AX,D
MOV AX,E
MOV AX,S
ADD AX,D[BX]
ADD AX,E[SI]
ADD AX,S[BX+DI]
CMP AX,D[BP]
CMP AX,E[BP+2]
CMP AX,S[BP+DI]
INC BYTE PTR [DI]
INC WORD PTR [SI+BP-1]
7.5 C SEGMENT
ASSUME CS:C
X DW 1
BEG: MOV AX,Y
ADD AX,X
...
Y DW 2
C ENDS
При трансляции команды MOV ассемблер зафиксирует ошибку, тогда как трансляция команды ADD пройдет без ошибки. В чем разница между этими двумя
случаями? Как исправить ошибку в команде MOV?
7.6 INCLUDE IO.ASM
S SEGMENT STACK
DB 128 DUP(?)
S ENDS
D1 SEGMENT
X DW 20000 DUP(?)
D1 ENDS
D2 SEGMENT
Y DW 20000 DUP(?)
D2 ENDS
C SEGMENT
ASSUME ... ;директива уточняется в условии задачи
BEG: ... ;ввод массивов X и Y
...
(*)
OUTINT AX ;вывод ответа
FINISH
C ENDS
END BEG
Вставьте в эту программу вместо (*) команды, которые проверяют на равенство массивы X и Y и записывают ответ (1 - равны, 0 - не равны) в регистр
AX. Предполагается, что до этих команд значения сегментных регистров не
определены и что в этой программе задана следующая директива ASSUME (других таких директив нет, новые не вводить):
а) ASSUME CS:C, DS:D1, ES:D2
б) ASSUME CS:C, DS:D1
в) ASSUME CS:C
7.7 Пусть в сегменте A описан массив X, в сегменте B - массив Y, а в
сегменте C - массив Z, причем каждый из этих массивов состоит из 45000
знаковых чисел-байтов. Выписать фрагмент программы, в котором все отрицательные элементы массива X переносятся в начало массива Y, а все остальные элементы - в начало массива Z, в предположении, что до этого фрагмента указана директива ASSUME, в которой сегменту A поставлен в соответствие регистр DS, и что этот регистр уже установлен на начало сегмента A.
7.8 Требуется записать в регистр AX слово памяти из ячейки с абсолютным адресом 20A75h. Определить, какие из следующих групп команд правильно
решают эту задачу:
а) MOV BX,20A75h б) MOV BX,20A7h в) MOV ES,20A7h
MOV AX,[BX] MOV AX,[BX+5] MOV AX,ES:5
г) MOV AX,20A7h д) MOV AX,20A7h е) MOV AX,20A7h
MOV ES,AX MOV DS,AX MOV DS,AX
MOV AX,ES:5 MOV AX,5 MOV BX,5
MOV AX,[BX]
7.9 Выписать фрагмент программы, в котором определяется, сколько ну-
левых байтов среди 300 байтов, начинающихся с абсолютного адреса 3FFF8h,
и ответ записывается в регистр AX.
7.10 Описать полную программу для решения следующей задачи.
а) Ввести непустой текст из любых символов (кроме точки), за которым
следует точка, и вывести этот текст, удалив из него лишние пробелы (из
подряд идущих пробелов оставить только один).
б) Ввести текст из 50 символов и определить, симметричен ли он. В качестве ответа вывести "симметричен" или "не симметричен".