TASK_ASM (1000388), страница 3
Текст из файла (страница 3)
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
и пусть сегмент команд имеет имя CODE. Предполагая неопределенными значения регистров DS и ES и не используя регистр SS, реализовать (выписать подходящую директиву ASSUME и группу команд) следующее сложение массивов:
а) Y:=X+Y б) Z:=X+Y
6.11 C SEGMENT
ASSUME CS:C
X DW 1
BEG: MOV AX,Y
ADD AX,X
...
Y DW 2
C ENDS
При трансляции команды MOV ассемблер зафиксирует ошибку, тогда как трансляция команды ADD пройдет без ошибки. В чем разница между этими двумя случаями? Как исправить ошибку в команде MOV?
6.12 A SEGMENT
DB 400 DUP(?)
A ENDS
Выписать группу команд, копирующих самих себя в начало сегмента A.
6.13 Пусть в программе описан следующий сегмент данных:
S SEGMENT
A DB 100 DUP(4)
B DW 5,8,6
S ENDS
и пусть регистр DS уже установлен на начало этого сегмента. Определить, какое значение будет иметь регистр AX после выполнения каждой из следующих команд:
а) MOV AX,B б) MOV AX,OFFSET B в) LEA AX,B
г) MOV AX,B+2 д) MOV AX,OFFSET B + 2 е) MOV AX,B - OFFSET B
6.14 X DB 200 DUP(?) ; X[0..199]
Пусть в регистре BX находится адрес (смещение) одного из элементов массива X. Используя оператор OFFSET реализовать переход на метку L, если:
а) в BX находится адрес элемента X[37];
б) BX указывает на вторую половину массива X.
6.15 Описать полную программу для решения следующей задачи.
а) Напечатать фразу "Hello Wordl".
б) Дан текст из 50 символов. Определить, симметричен ли он. Ответ: "симметричен" или "не симметричен".
в) Дан массив из 40000 чисел (размером в слово). Определить, симметричен ли этот массив. Ответ: "да" или "нет".
г) Дан текст из любых символов (кроме точки), за которым следует точка и в котором не более 66000 символов. Напечатать этот текст в обратном порядке.
д) Дан непустой текст из любых символов (кроме точки), за которым следует точка. Напечатать этот текст, удалив из него лишние пробелы (из подряд идущих пробелов оставить только один).
е) Дан текст из больших латинских букв, за которым следует точка. Для каждой буквы указать, сколько раз она входит в этот текст.
ж) Дан непустой текст из любых символов (кроме точки), за которым следует точка. Определить, сколько различных больших русских гласных букв (А, Е, И, О, У, Ы, Э, Ю, Я) входит в этот текст.
6.16 Пусть под сегмент стека отведено 900 байтов. Реализовать переход на метку L, если в текущий момент:
а) стек полон;
б) стек пуст;
в) стек занимает ровно треть сегмента стека.
6.17 Используя любые регистры как вспомогательные, описать через другие команды действие команды:
а) PUSH AX б) POP AX
6.18 Определить, какие значения будут находиться в байте с адресом SS:SP и в байте с адресом SS:(SP+1) после выполнения команд
MOV AX,0102h
PUSH AX
6.19 Выписать фрагмент программы, в котором вводится последовательность ненулевых чисел, заканчивающаяся нулем, и эти числа выводятся в обратном порядке, но только если среди них нет отрицательных чисел (в противном случае ничего не выводить). Исходное значение регистра SP должно быть сохранено.
6.20 Пусть в стек записано 40 слов. Реализовать следующую операцию:
а) поменять местами два "верхних" слова стека, сохранив при этом значения всех регистров и не используя переменные;
б) определить, сколько среди этих слов нулевых, и записать ответ в регистр AL;
в) удалить из стека нулевые слова, "сжав" остальные (дополнительный массив не использовать);
г) определить, есть ли в стеке хотя бы два одинаковых слова, и записать ответ 1 (есть) или 0 в регистр AL;
д) рассматривая слова из стека как адреса (смещения) некоторых байтов из сегмента данных, обнулить все эти байты.
6.21 Пусть под сегмент стека отведено 200 слов и пусть в сегменте данных описан массив X из 200 слов. Выписать фрагмент программы, в котором в начало этого массива копируется текущее содержимое стека ("верхнее" слово стека должно быть записано в начальный элемент массива) и заполняется нулями оставшаяся часть массива. Значение регистра SP должно быть сохранено.