Пильщиков В.Н. - Упражнения по языку ассемблера MASM (1110572), страница 3
Текст из файла (страница 3)
WD DB 'воскресенье' ; день недели
DATE ENDS
Описать переменные D1, D2, D3 и D4 типа DATE со следующими начальными значениями их полей (знак ? означает, что поле не должно иметь начального значения):
Y M D WD
D1: 1945 5 13 среда
D2: 1997 12 ? четверг
D3: ? ? ? ?
D4: 1997 ? ? воскресенье
Директивы, описывающие эти переменные, должны быть максимально короткими.
4.28 TIME STRUC ; время какого-то момента суток
H DB ? ; час (от 0 до 23)
M DB ? ; минута (от 0 до 59)
S DB ? ; секунда (от 0 до 59)
TIME ENDS
T TIME <>
T1 TIME <>
Присвоить переменной T1 время, на 1 секунду большее времени T. (Учесть смену суток.)
4.29 Описать структурный тип PERSON (человек) со следующими тремя полями: FAM (фамилия) - из 20 байтов, NAME (имя) - из 10 байтов и AGE (возраст) - 1 байт. Описать также (без начальных значений) переменную P типа PERSON и массив GR (группа людей) из 40 элементов того же типа. Считая, что этим переменным в программе уже присвоены какие-то значения, решить следующую задачу (ответ записать в регистр AL):
а) определить, является ли P человеком в возрасте 17 лет, вторая буква в фамилии которого - это "е" (ответ: 1 (является) или 0);
б) определить, сколько людей из GR имеют тот же возраст, что и P;
в) напечатать фамилию самого молодого человека из группы GR (любого, если таких несколько);
г) определить, сколько людей из GR имеют то же имя, что и P;
д) определить, есть ли в GR хотя бы одна пара однофамильцев (ответ: 1 (есть) или 0).
4.30 Имеются символьные переменные 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 ? ;длина подстроки (число символов в ней)
SUBSTR ENDS
(Например, директива X SUBSTR <T,60,20> описывает подстроку из последних 20 символов строки T.)
Имеются две подстроки:
A SUBSTR <>
B SUBSTR <>
которые в процессе выполнения программы получили некоторые значения (считать, что эти значения корректно задают подстроки: подстрока не выходит за пределы строки и т.п.).
Решить следующую задачу:
а) если в подстроку A входит пробел, тогда сделать значением переменной B подстроку из 15 начальных символов строки S;
б) если подстроки A и B равны (состоят из равного числа попарно равных символов), тогда в регистр AL записать 1, а иначе - 0.
5. БИТОВЫЕ ОПЕРАЦИИ. УПАКОВАННЫЕ ДАННЫЕ.
5.1 Указать значения регистра AL и флага ZF после выполнения следующей пары команд:
а) MOV AL,1010b б) MOV AL,0 в) MOV AL,1101b г) MOV AL,100b
NOT AL NOT AL AND AL,0111b AND AL,011b
д) MOV AL,100b е) MOV AL,0F0h ж) MOV AL,0 з) MOV AL,101b
TEST AL,011b OR AL,0Fh XOR AL,0FFh XOR AL,AL
5.2 A DB ?
B DB ?
X DW ? ; число со знаком
Рассматривая A и B как логические переменные, принимающие лишь значения 0 ("ложь") и 0FFh ("истина"), реализовать следующее присваивание:
а) A := A and not B or not A and B
б) A := B or (X>2) and A
в) A := A>=B (команды условного перехода не использовать)
5.3 Пусть под логические переменные A и B выделено по байту:
A DB ?
B DB ?
и пусть выбрано следующее представление для логических значений: "ложь" - нулевой байт, "истина" - любой ненулевой байт. Реализовать при этом представлении следующие операции:
а) A:=not A б) A:=A and B в) A:=A or B
5.4 Предложить машинное представление (размером в байт) для логических значений, которое отлично от известного представления
false = 00h, true = 0FFh
и при котором команды NOT, AND и OR правильно реализуют логические операции отрицания, конъюнкции и дизъюнкции соответственно.
5.5 Указать значения регистра AL и флага CF после выполнения следующей группы команд:
а) MOV AL,101b б) MOV AL,1100b в) MOV AL,110b г) MOV AL,110b
SHL AL,1 MOV CL,5 SHR AL,1 MOV CL,3
SHL AL,CL SHR AL,CL
д) MOV AL,0F0h е) MOV AL,101b ж) MOV AX,1122h з) MOV AX,1122h
ROL AL,1 MOV CL,2 SHR AH,1 SHR AH,1
ROR AL,CL RCL AL,1 RCR AL,1
5.6 Пусть X и Y - беззнаковые переменные-слова. Не используя команды умножения и деления, реализовать следующее присваивание:
а) Y:=4*X - X div 8 + X mod 16
б) Y:=35*X
5.7 X DW ? ; число без знака
Реализовать условный переход на метку L, если X - четное число, четырьмя способами - соответственно с помощью команд DIV, AND, TEST и SHR. Какой из этих способов лучше и почему?
5.8 Y20 DW 30 DUP(?)
Рассматривая элементы массива Y20 как порядковые номера некоторых годов 20 века (от 1901 до 2000), подсчитать количество високосных годов среди них и записать ответ в регистр AL.
5.9 X DD ? ; число со знаком
Не используя команды условного перехода, записать в регистр AL знаковый бит числа X, т.е. 1, если X<0, и 0 иначе.
5.10 Реализовать следующую операцию:
а) сделать переход на метку L, если 4 средних бита регистра AL - это 1001b;
б) сделать переход на метку L, если 2 правых бита регистра AL равны 2 правым битам регистра BL;
в) сделать переход на метку L, если равны 3 левых и 3 правых бита регистра AX;
г) записать в регистр CL байт, составленный из 4 левых битов регистра AL и 4 правых битов регистра BL;
д) в регистре AX заменить 5 левых битов на 5 правых.
5.11 Решить следующую задачу:
а) подсчитать число двоичных единиц в значении регистра AX и записать это число в регистр DH;
б) не используя команды деления, напечатать значение регистра AX в виде беззнакового двоичного числа без незначащих нулей;
в) перевернуть содержимое регистра AX;
г) не используя команды умножения, ввести беззнаковое двоичное число и записать его в регистр AX (считать, что число задано без ошибок, содержит от 1 до 16 цифр и заканчивается пробелом).
5.12 Пусть A, B - беззнаковые переменные-слова, а C - переменная типа DWORD. Без команды умножения реализовать операцию C:=16*A+B.
5.13 Не используя команды умножения и деления и используя буквы A-F как "буквенные" 16-ричные цифры, решить следующую задачу:
а) вывести значение регистра AX в виде 4-значного шестнадца-тиричного числа;
б) ввести шестнадцатиричное число и записать его в регистр AX (считать, что число записано без ошибок, содержит от 1 до 4 цифр, за числом следует пробел).
5.14 При так называемом двоично-десятичном представлении целых (неотрицательных) чисел каждая цифра в десятичной записи числа заменяется на 4-битовый двоичный код этой цифры (0 0000, 1 0001, ..., 9 1001), причем соседние пары таких четверок упаковываются в один байт. Например, десятичное число 193 в этом представлении имеет следующий вид:
0000 0001 1001 0011
Решить следующую задачу:
а) в регистре BX хранится число от 0 до 9999, представленное в двоично-десятичном виде; перевести его в обычное двоичное представление и записать в регистр AX;
б) регистре AX хранится число от 0 до 9999 в обычном двоичном представлении; записать в регистр BX двоично-десятичное представление этого числа.
5.15 T RECORD A:1=1, B:3=5, C:2
X T < ,2>
Указать значение:
а) всего байта X и полей A, B и C в нем;
б) выражений WIDTH X, WIDTH A, WIDTH B и WIDTH C;
в) выражений MASK X, MASK A, MASK B и MASK C;
г) выражений A, B и C.
5.16 TR RECORD A:3, B:2, C:3
R TR <>
Реализовать следующую операцию (все поля - из переменной R):
а) полю A присвоить значение поля C;
б) поменять местами значения полей A и C;
в) перейти на метку L, если значения полей A и B равны.
5.17 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 (распаковать дату);
б) переменной DT2 присвоить дату, являющуюся значением DT1 (упаковать дату);
в) проверить на равенство даты DT1 и DT2 и записать в регистр L значение 1, если даты равны, и значение 0 иначе.
5.18 DATE RECORD D:5, M:4, Y:7 ; дата в формате
; "день-месяц-год (две последние цифры)"
DATE1 RECORD Y1:7, M1:4, D1:5 ; дата в формате
; "год-месяц-день"
A DATE <>
A1 DATE1 <>
Решить следующую задачу:
а) вывести дату A в виде dd.mm.yy (например: 16.5.97);
б) присвоить переменной A1 ту же дату, что записана в переменной A.
5.19 Имеются числовые константы L и R (L<R) и переменные
M DB (R-L)/8+1 DUP(?)
S DB (R-L)/8+1 DUP(?)
X DW ? ; LXR
Рассматривая M и S как упакованные множества целых чисел из отрезка [L,R], решить следующую задачу:
а) из множества M удалить все элементы, входящие в множество S;
б) перейти на метку SUBSET, если множество S является подмножеством множества M;
в) в множество M добавить элемент X;
г) из множества M удалить элемент X;
д) определить, сколько элементов входит в множество M, и записать ответ в регистр AX;
е) напечатать все числа, входящие в множество M.
5.20 var B: packed array[0..99] of boolean;
i: 0.99;
Предложить для массива B упакованное машинное представление, описать этот массив и реализовать следующую операцию:
а) присвоить всем элементам массива B значение true;
б) поменять на противоположное значение всех элементов массива B;
в) B[28] := not B[28];
г) B[i] := false;
д) B[i] := B[i] and B[41] or B[80]
6. СЕГМЕНТИРОВАНИЕ. ПОЛНЫЕ ПРОГРАММЫ. СТЕК.
6.1 Пусть DS=8208h, ES=8400h, BX=0FFF0h, SI=12h, offset X=28Ah.
Вычислить (20-разрядный) абсолютный адрес второго операнда следующей команды:
а) MOV AX,DS:210Ah б) CMP BX,ES:X
в) ADD CX,DS:[BX] г) OR DX,ES:X[BX+SI]
6.2 Пусть DS=1100h, SS=0FF00h, BX=8000h, BP=8000h, SI=9003h.
Определить, какой сегментный регистр подразумевается по умолчанию в следующей команде, и вычислить абсолютный адрес ее первого операнда:
а) SUB [SI],CL б) MOV [BX+2],DX
в) MOV [BP+2],DX г) AND [BP+SI-1],BH
6.3 X DW ?
Среди перечисленных команд указать ошибочные:
а) MOV DS,1000h б) MOV DS,AX в) MOV CS,AX г) MOV AX,CS
д) MOV ES,DS е) MOV DS,X ж) MOV X,CS з) LEA ES,X
6.4 Требуется записать в регистр AL содержимое байта памяти с абсолютным адресом 01234h. Определить, какие из следующих групп команд правильно решают эту задачу, а какие - нет и почему.
а) MOV AL,1234h б) MOV BX,1234h в) MOV DS,0
MOV AL,[BX] MOV AL,DS:1234h
г) MOV AX,0 д) MOV AX,1234h е) MOV AX,123h
MOV ES,AX MOV ES,AX MOV DS,AX
MOV AL,ES:1234h MOV AL,ES:0 MOV AL,DS:4
6.5 Реализовать следующую операцию:
а) поменять местами значения байтов с абсолютными адресами 80000h и 80024h;
б) в слово памяти с абсолютным адресом 803FAh записать содержимое слова памяти с абсолютным адресом 90400h;
в) подсчитать количество нулевых байтов среди 20 байтов памяти, начинающихся с абсолютного адреса 12345h, и записать ответ в регистр AL.
6.6 Пусть в программе имеются следующие программные сегменты:
A SEGMENT
DW 100 DUP(?)
A ENDS
B SEGMENT
DW 100 DUP(?)
B ENDS
Реализовать перепись содержимого всего сегмента B в сегмент A.
6.7 ABS DD ?
PAIR DD ?
Значение переменной ABS трактуется как 20-разрядный абсолютный адрес некоторой ячейки памяти, а значение переменной PAIR - как адрес этой же ячейки, но заданный в виде адресной пары сегмент:смещение (seg:ofs), причем в силу "перевернутого" представления двойных слов в памяти часть ofs находится в первом слове этой переменной, а часть seg - во втором.
Не используя команды умножения и деления, решить следующие задачи:
а) преобразовать абсолютный адрес ABS в адресную пару PAIR;
б) преобразовать адресную пару PAIR в абсолютный адрес ABS;
в) нормализовать адресную пару PAIR, т.е. преобразовать ее к виду, где смещение ofs не превосходит 15 (0Fh); например, пару 4567h:1112h надо привести к виду 4678h:2h.
6.8 Пусть переменная-слово D описана в программном сегменте D1, переменная E - в сегменте E1, а переменная S - в сегменте S1. Пусть имеется директива (C - сегмент команд)
ASSUME CS:C, DS:D1, ES:E1, SS:S1
Для каждой из следующих команд определить, какой из префиксов (DS:, ES: или SS:) выберет ассемблер при трансляции ее второго операнда, и определить, сохранит ли ассемблер этот префикс при формировании соответствующей машинной команды.
а) 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+SI+2] и) CMP AX,S[BP+DI]
6.9 Пусть переменная-слово D описана в сегменте D1, а переменная-слово E - в сегменте E1 и пусть регистры DS и ES уже установлены на начало сегментов D1 и S1 соответственно. Реализовать присваивание AX:=D+E при условии, что имеется следующая директива ASSUME (C - имя сегмента команд):
а) ASSUME CS:C, DS:D1, ES:S1
б) ASSUME CS:C, DS:D1
в) ASSUME CS:C, ES:S1
г) ASSUME CS:C
6.10 Пусть в программе описаны следующие три сегмента:
A SEGMENT B SEGMENT C SEGMENT
... .. ...
X DW 1000 DUP(?) Y DW 1000 DUP(?) Z DW 1000 DUP(?)
... ... ...
A ENDS B ENDS C ENDS