TASK_ASM (1000388), страница 6
Текст из файла (страница 6)
MOV R,U
ENDM
B MACRO R,V
A R,<V>
ENDM
C MACRO R,V
A R,V
ENDM
Определить значения регистров AH и AL после выполнения следующего фрагмента программы:
B AH,<BYTE PTR X>
C AL,<BYTE PTR X>
9.9 Описать в виде макроса MAX2 M,X,Y вычисление M=max(X,Y) и на его основе описать макрос MAX3 M,X,Y,Z для вычисления M=max(X,Y,Z), где M, X, Y и Z - знаковые байтовые переменные.
Выписать макрорасширение для макрокоманды
MAX3 A,<BYTE PTR B>,C+1,D
9.10 Пусть K - числовая константа с положительным значением, а , и - некоторые группы предложений. Используя средства условного ассемблирования, выписать фрагмент исходной программы, в котором , и указаны лишь по разу и по которому в зависимости от значения K формируются следующие варианты окончательной программы:
при K=1: при K=2: при K>2:
... (K раз)
9.11 Пусть RUN - константа, которая своим значением 1 или 0 указывает режим текущего прогона программы: счет или отладка. Используя средства условного ассемблирования, выписать фрагмент программы, в котором находится наибольший общий делитель двух положительных чисел с записью его в регистр AX, при условии, что в режиме счета эти два числа должны вводиться, а в режиме отладки эти числа равны 45 и 30.
9.12 Имеются следующие описания макроса M X, который должен уменьшить значение X на 5, если X - это переменная-байт, или на 12, если X - это переменная-слово:
а) M MACRO X б) M MACRO X в) M MACRO X
LOCAL L2,L LOCAL L2,L IF TYPE X EQ BYTE
CMP TYPE X,BYTE MOV AL,TYPE X SUB X,5
JNE L2 CMP AL,BYTE ELSE
SUB X,5 JNE L2 SUB X,12
JMP L SUB X,5 ENDIF
L2: SUB X,12 JMP L ENDM
L: L2: SUB X,12
ENDM L:
ENDM
Какое из этих описаний неправильно (и почему) и какое из двух правильных описаний лучше другого (и почему)?
9.13 Описать в виде макроса SHIFT X,K (X - имя байтовой переменной, K - явно заданное число) сдвиг значения X на |K| разрядов вправо (при K>0) или влево (при K<0).
Выписать макрорасширения для макрокоманд SHIFT A,-1 и SHIFT B,5.
9.14 Описать в виде макроса IF0 X,L (X - переменная размером в байт, слово или двойное слово, L - метка) переход на метку L в том случае, когда значение переменной X равно 0.
Выписать макрорасширения для макрокоманд IF0 B,L1 и IF0 D,L2 при условии, что B - переменная типа BYTE, а D - типа DWORD.
9.15 Описать в виде макроса SIGN X (X - знаковая переменная размером в байт, слово или двойное слово) операцию засылки в регистр AL числа 1 при X>0, числа 0 при X=0 и числа -1 при X<0.
Выписать макрорасширения для макрокоманд SIGN W и SIGN D при условии, что W - переменная размером в слово, а D - размером в двойное слово.
9.16 Описать в виде макроса NULL X,N,T (X - имя массива из N байтов, N - положительное целое число, T - это FIRST или LAST) обнуление либо начального (при T=FIRST), либо последнего (при T=LAST) элемента массива X.
Выписать макрорасширение для макрокоманды NULL A,100,LAST.
9.17 Описать в виде макрос VAR X,EQ,V определение байтовой переменной с именем X и начальным значением V, а если последний параметр не задан - без начального значения (параметр EQ фиктивный).
Выписать макрорасширения для макрокоманд:
а) VAR A = '*' б) VAR B : <10 DUP(?)> в) VAR C г) VAR
9.18 Описать в виде макроса NULL RS (RS - это <R1,R2,...,Rk>, где Ri - имена регистров общего назначения, k0) обнуление регистров Ri.
Выписать макрорасширения для макрокоманд NULL <AL,BX,SI> и NULL <>.
9.19 Описать макрос SUM R, где R - имя (большими буквами) одного из 16-разрядных регистров общего назначения, для записи в R суммы значений всех остальных таких регистров.
9.20 Описать в виде макроса OUTF без параметров вывод текущих значений флагов CF, OF, SF и ZF в виде четверки из 0 и 1, причем значения всех флагов и используемых макросом регистров должны быть сохранены.
Воспользоваться командами PUSHF и POPF. В регистре флагов Flags указанным флагам соответствуют биты со следующими номерами (нумерация битов справа налево от 0): CF - 0, OF - 11, SF - 7, ZF - 6.
9.21 Описать в виде макроса SL RS,OP (RS - это <R1,R2,...,Rk>, где Ri - 16-разрядные регистры общего назначения, k>0; OP - это SAVE или LOAD) запись в стек (при OP=SAVE) или восстановление из стека (при OP=LOAD) регистров Ri.
Выписать макрорасширение для макрокоманды SL <AX,CX,DI>,LOAD.
9.22 Описать в виде макроса SUM X (X - это <X1,X2,...,Xk>, где Xi - имена знаковых байтовых переменных, k>0) вычисление суммы значений Xi и записи ее в регистр BX.
Выписать макрорасширение для макрокоманды SUM <A,B,C>.
9.23 Описать в виде макроса MAX X (X - это <X1,X2,...,Xk>, где Xi - имена знаковых байтовых переменных, k>0) вычисление максимума Xi и записи его в регистр AL. (Обратить особое внимание на метки, которые будут появляться в макрорасширениях.)
Выписать макрорасширение для макрокоманды MAX <A,B,A>.
9.24 Предположим, что имеется процедура P от двух параметров, которые по значению передаются через регистры AX и BX. Описать в виде макроса CALL_P X,Y команды обращения к этой процедуре, которые должны сохранять регистры AX и BX и которые должны корректно работать, когда в качестве X и Y указаны AX и/или BX. (Считать, что названия регистров записываются только большими буквами.)
Выписать макрорасширения для макрокоманд:
а) CALL_P Q,2 б) CALL_P AX,BX в) CALL_P BX,5 г) CALL_P BX,AX
9.25 Выписать при указанном макроопределении макрорасширение для указанной макрокоманды:
а) MA MACRO K б) MB MACRO K в) MV MACRO K
JMP M1 MOV AH,K A EQU K
MOV AX,K IFIDN <AH>,<2> IFDIF <A>,<K>
M&K: ADD AX,K ADD AH,K ADD DX,A&K
ENDM ENDIF ENDIF
... ENDM ENDM
MA 1 ... ...
MB 2 MV 3
г) MG MACRO K д) MD MACRO K е) ME MACRO K
IFDIF <K+1>,<5> IF K+1 EQ 6 MOV AH,0
MOV AX,K X DB '&K+1' IRPC C,K-1
ENDIF ENDIF ADD AH,'&C'
MOV BX,K&K Y&K DW K+1 ENDM
ENDM ENDM ENDM
... ... ...
MG 4 MD 5 ME 6
10. МНОГОМОДУЛЬНЫЕ ПРОГРАММЫ.
10.1 Ответить на следующие вопросы относительно многомодульной программы:
а) Обязательно ли в каждом модуле программы описывать сегмент стека?
б) Если в программе используются вспомогательные процедуры ввода-вывода из файла IO.ASM, то обязательно ли в каждом модуле указывать директиву INCLUDE IO.ASM?
в) Как ассемблер, транслируя некоторый модуль программы, узнает, что какое-то имя в этом модуле является внешним? А общим?
г) Обязательно ли имя, объявленное в модуле общим, должно быть описано в этом модуле? Можно ли использовать данное имя в этом модуле?
д) Можно ли одно и то же имя объявить общим в нескольких модулях программы? А внешним?
10.2 Пусть в некотором модуле программы описана процедура P, которой через регистр AX передается по значению единственный параметр. Что надо сделать в другом модуле программы, чтобы обратиться к этой процедуре с нулевым фактическим параметром?
10.3 Пусть в первой строке текста некоторого модуля программы указана директива EXTRN X:WORD и пусть в этом модуле требуется записать значение переменной X в регистр AX. Определить, какой из следующих фрагментов правильно решает эту задачу.
а) MOV AX,X б) MOV AX,ES:X в) MOV AX,SEG X г) MOV AX,SEG X
MOV ES,AX MOV DS,AX
MOV AX,ES:X MOV AX,X
10.4 Выписать (не основной) модуль программы, где описаны доступные другим модулям байтовая переменная STEP с начальным значением 1 и дальняя процедура NEXT без параметров, которая увеличивает на STEP значение байтовой переменной TIME из какого-то другого модуля.
10.5 Выписать вспомогательный модуль программы, содержащий описание доступной другим модулям дальней процедуры NOD, которая находит и записывает в регистр AX наибольший общий делитель двух натуральных чисел, переданных через регистры AX и BX.
Выписать также основной модуль программы, который вводит 4 натуральных числа и, используя процедуру NOD, определяет их наибольший общий делитель.
10.6 Выписать вспомогательный модуль программы, содержащий описание доступных другим модулям массива PRIM из 50 слов и дальней процедуры INIT, которая инициирует этот массив, записывая в него первые 50 простых чисел (2, 3, 5, ...).
Выписать основной модуль программы, который вводит последовательность натуральных чисел (за ней следует 0) и, используя процедуру INIT и массив PRIM, подсчитывает, сколько среди этих чисел равных первым 50 простым числам.
10.7 Используя для очереди ("первый пришел - первым ушел") векторное представление, выписать вспомогательный модуль программы, в котором резервируется место (5 массивов по 1000 слов) для 5 очередей и описываются в виде процедур следующие операции над очередями:
- образовать новую (пустую) очередь (очереди можно идентифицировать по номерам 1, 2, ..., 5);
- проверить, пуста ли указанная (по номеру) очередь;
- записать элемент в указанную очередь;
- считать элемент из указанной очереди.
(Способ хранения элементов очереди в массиве, название процедур и т.п. - продумать самим.)
Выписать также основной модуль программы, который, используя процедуры из вспомогательного модуля, вводит последовательность ненулевых чисел (за ней следует 0) и печатает их в следующем порядке: сначала - все отрицательные числа, затем - все числа, большие 500, и в конце - все остальные числа. При этом внутри каждой из этих трех групп чисел должно быть сохранено их исходное взаимное расположение.
10.8 Считая, что имеется вспомогательный модуль из предыдущего упражнения, выписать основной модуль программы, который вводит последовательность ненулевых чисел (за ней следует 0), в которой равное число положительных и отрицательных чисел, и печатает поочередно положительные и отрицательные числа (первым - положительное число), сохраняя при этом исходный взаимный порядок как среди положительных, так и среди отрицательных чисел. (Каждое число печатать, как только это становится возможным.)
СОДЕРЖАНИЕ
1. ОПИСАНИЕ ДАННЫХ. ПЕРЕСЫЛКИ. 3
2. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ. 5
3. ПЕРЕХОДЫ. ЦИКЛЫ. ВВОД-ВЫВОД. 8
4. ИНДЕКСИРОВАНИЕ. МАССИВЫ. СТРУКТУРЫ. 11
5. БИТОВЫЕ ОПЕРАЦИИ. УПАКОВАННЫЕ ДАННЫЕ. 177
6. СЕГМЕНТИРОВАНИЕ. ПОЛНЫЕ ПРОГРАММЫ. СТЕК. 200
7. ПРОЦЕДУРЫ. 255
8. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ. 300
9. МАКРОСРЕДСТВА. 344
10. МНОГОМОДУЛЬНЫЕ ПРОГРАММЫ. 39
38