
МУ_2542_МПТ_Тарабардин_2010
.pdfКраткие теоретические сведения
Ранее были рассмотрены элементарные задачи вычислительного характера. Все они были линейного типа, т.е. команды выполнялись в той последовательности, в которой они записаны в память. На практике чисто линейные программы почти не встречаются. В прикладных программах обязательно встречаются нелинейные участки, где порядок выполнения команд может изменяться в зависимости от значения каких либо переменных, используемых в программе. Речь идёт о вызове подпрограмм, условных переходах и построенных на базе их циклах [5].
Под условными переходами понимается переход процессора к выполнению команды с указанным в программе адресом при выполнении какого-либо условия. Это осуществляется путём установки значения счётчика PC равным нужному адресу. В качестве таких условий чаще всего выступают равенство нулю результата выполнения предыдущей команды либо перенос единичного бита в старший разряд в результате выполнения арифметической или логической операции. Факт нулевого результата и переноса всегда фиксируется в битах флагового регистра состояния F. Существуют также безусловные переходы, когда выполнение указанной команды начинается без условия, т.е. в любом случае.
На базе условного или безусловного перехода можно организовать цикл – многократно повторяющуюся последовательность команд. Для этого в конце цикла обычно делают проверку необходимого условия и в случае его выполнения осуществляют переход к обработке команды, адрес которой соответствует началу цикла.
Для организации условных переходов и циклов рассмотрим необходимые команды. Наиболее распространённые команды логических операций и передачи управления приведены ниже.
Таблица 1
Команды логических операций и передачи управления
№ |
Команд |
Синтаксис |
Назначение |
|
Пример использования |
|
Раз- |
||||||
п/п |
а |
|
|
|
|
|
|
|
|
|
|
|
мер |
1 |
2 |
3 |
|
4 |
|
|
|
5 |
|
|
|
|
6 |
1 |
RRC |
RRC |
Циклический |
сдвиг |
вправо |
MVI A,01000111b |
|
|
|
|
1 |
||
|
|
|
содержимого аккумулятора. |
RRC |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
Результатом |
выполнения |
дан- |
|
||||
|
|
|
|
|
|
ной программы будет сдвиг всех |
|
||||||
|
|
|
|
|
|
битов исходного числа на 1 |
|
||||||
|
|
|
|
|
|
вправо. При этом младший бит |
|
||||||
|
|
|
|
|
|
исходного числа переносится в |
|
||||||
|
|
|
|
|
|
старший |
|
разряд. |
|
Т.е. |
|
||
|
|
|
|
|
|
результатом |
|
будет |
запись |
в |
|
||
|
|
|
|
|
|
аккумулятор числа 10100011b. |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
||
2 |
RLC |
RLC |
Циклический |
сдвиг |
влево |
MVI A,01000111b |
|
|
|
|
1 |
||
|
|
|
содержимого аккумулятора. |
RLC |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
Команда |
по |
своей |
сути |
|
|||
|
|
|
|
|
|
противоположна |
команде |
RRC. |
|
||||
|
|
|
|
|
|
Результатом |
будет |
запись |
в |
|
|||
|
|
|
|
|
|
аккумулятор числа 10001111b. |
|
|
1 |
2 |
3 |
|
|
4 |
|
|
|
|
|
|
|
5 |
|
|
|
6 |
3 |
CMP |
CMP R |
Сравнение |
содержимого ре- |
CMP B – если содержимое регис- |
1 |
|||||||||||
|
|
CMP M |
гистра R или ячейки памяти M |
тров B и A совпадают, то в бит |
|
||||||||||||
|
|
|
с содержимым аккумулятора. |
|
признака нулевого результата ре- |
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
гистра F будет записана единица, |
|
||||||
|
|
|
|
|
|
|
|
|
|
в противном случае туда будет |
|
||||||
|
|
|
|
|
|
|
|
|
|
записан ноль. |
|
|
|
|
|
|
|
4 |
JC |
JC ADR |
Переход |
|
к |
выполнению |
JC 0105h – переход к выполнению |
3 |
|||||||||
|
|
JC L |
команды с адресом ADR или |
команды с адресом 0105h в слу- |
|
||||||||||||
|
|
|
записанной в программе после |
чае, если бит переноса в регистре |
|
||||||||||||
|
|
|
метки L в том случае, если в |
состояния F |
имеет |
единичное |
|
||||||||||
|
|
|
результате выполнения пре- |
значение; |
|
|
|
|
|
|
|||||||
|
|
|
дыдущей команды произошёл |
JC LABEL1 – переход к выполне- |
|
||||||||||||
|
|
|
перенос |
единичного |
бита |
в |
нию команды, |
записанной в про- |
|
||||||||
|
|
|
старший или младший разряд. |
грамме |
после |
|
метки |
LABEL1, |
в |
|
|||||||
|
|
|
Другими словами, переход бу- |
случае, если бит переноса в ре- |
|
||||||||||||
|
|
|
дет выполнен в случае еди- |
гистре |
состояния |
F |
имеет |
|
|||||||||
|
|
|
ничного |
бита |
переноса |
в |
единичное значение. |
|
|
|
|
||||||
|
|
|
регистре состояния F. |
|
|
|
|
|
|
|
|
|
|
|
|||
5 |
JNC |
JNC ADR |
Переход к выполнению коман- |
JNC 0105h – переход к выполне- |
3 |
||||||||||||
|
|
JNC L |
ды с адресом ADR или запи- |
нию команды с адресом 0105h в |
|
||||||||||||
|
|
|
санной |
в |
программе |
после |
случае, |
если |
|
бит |
переноса |
в |
|
||||
|
|
|
метки L в том случае, если в |
регистре |
состояния |
F |
имеет |
|
|||||||||
|
|
|
результате |
выполнения |
пре- |
нулевое значение; |
|
|
|
|
|||||||
|
|
|
дыдущей команды не произо- |
JNC LABEL1 – переход к выполне- |
|
||||||||||||
|
|
|
шёл перенос единичного бита |
нию команды, |
записанной |
в |
|
||||||||||
|
|
|
в старший или младший раз- |
программе после метки LABEL1, в |
|
||||||||||||
|
|
|
ряд. |
|
|
|
|
|
|
случае, |
если |
|
бит |
переноса |
в |
|
|
|
|
|
|
|
|
|
|
|
|
регистре |
состояния |
F |
имеет |
|
|||
|
|
|
|
|
|
|
|
|
|
нулевое значение. |
|
|
|
|
|||
6 |
JZ |
JZ ADR |
Переход к выполнению коман- |
JZ 0105h – переход к выполнению |
3 |
||||||||||||
|
|
JZ L |
ды с адресом ADR или запи- |
команды с адресом 0105h, если |
|
||||||||||||
|
|
|
санной |
в |
программе |
после |
бит переноса в регистре состоя- |
|
|||||||||
|
|
|
метки L |
в |
том |
случае, |
если |
ния F имеет единичное значение; |
|
|
|||||||
|
|
|
результат выполнения преды- |
JZ LABEL1 – переход к выполне- |
|
||||||||||||
|
|
|
дущей команды равен нулю. |
нию команды, записанной в про- |
|
||||||||||||
|
|
|
Другими |
словами, |
переход |
грамме |
после |
|
метки |
LABEL1, |
в |
|
|||||
|
|
|
будет выполнен в случае еди- |
случае, |
если |
|
бит |
переноса |
в |
|
|||||||
|
|
|
ничного бита нулевого резуль- |
регистре |
состояния |
F |
имеет |
|
|||||||||
|
|
|
тата в регистре состояния F. |
|
единичное значение. |
|
|
|
|
||||||||
7 |
JNZ |
JNZ ADR |
Переход |
|
к |
выполнению |
JNZ 0105h – переход к выполне- |
3 |
|||||||||
|
|
JNZ L |
команды с адресом ADR или |
нию команды с адресом 0105h в |
|
||||||||||||
|
|
|
записанной в программе после |
случае, |
если |
|
бит |
переноса |
в |
|
|||||||
|
|
|
метки L |
в |
том |
случае, |
если |
регистре |
состояния |
F |
имеет |
|
|||||
|
|
|
результат выполнения преды- |
единичное значение; |
|
|
|
|
|||||||||
|
|
|
дущей |
команды не |
|
равен |
JNZ LABEL1 – переход к выполне- |
|
|||||||||
|
|
|
нулю. Другими словами, |
пере- |
нию команды, |
записанной |
в |
|
|||||||||
|
|
|
ход будет выполнен в том слу- |
программе после метки LABEL1, в |
|
||||||||||||
|
|
|
чае, если бит нулевого резуль- |
случае, |
если |
|
бит |
переноса |
в |
|
|||||||
|
|
|
тата в регистре |
состояния |
F |
регистре |
состояния |
F |
имеет |
|
|||||||
|
|
|
равен нулю. |
|
|
|
|
|
единичное значение. |
|
|
|
|
||||
8 |
JMP |
JMP ADR |
Переход к выполнению коман- |
JMP 0105h – переход к выполне- |
3 |
||||||||||||
|
|
JMP L |
ды с адресом ADR или запи- |
нию команды с адресом 0105h; |
|
|
|||||||||||
|
|
|
санной |
в |
программе |
после |
JMP LABEL1 – переход по метке. |
|
|
||||||||
|
|
|
метки L в любом случае. |
|
|
|
|
|
|
|
|
|
|

Оборудование для выполнения работы
Работа выполняется на ПК с операционной системой Windows NT/2000/XP в среде отладки CPM.
Порядок выполнения работы
1. В качестве примера рассмотрим задачу вычисления количества нулевых бит в 8-разрядном двоичном числе. Блок-схема алгоритма программы, решающей эту задачу, представлена на рис. 1.
|
Рис. 1. Блок-схема алгоритма программы |
2. Текст рассматриваемой программы приведён ниже. |
|
org 100h |
;Установка начального адреса программы |
mvi A,01000101b ;Запись в аккумулятор исходного числа |
|
mvi D,8 |
;Установка счётчика цикла |
mvi B,0 |
;Установка начального результата |
L2: |
;Метка возврата цикла |
rrc |
;Сдвиг числа вправо на 1 бит |
jc L1 |
;Если в результате выполнения команды RRC |
|
;был осуществлён перенос единичного бита в старший |
|
;разряд, то выполняется команда по метке L1 (dcr D) |
inr B |
;Иначе счётчик нулей B увеличивается на 1 |
L1: |
;Метка перехода по условию jc L1 |
dcr D |
;Уменьшение счётчика цикла на 1 |
jnz L2 |
;Если счётчик цикла не достиг нуля цикл выполняется заново |
end |
;Конец программы |
Результат выполнения программы – количество нулевых разрядов двоичного числа – будет записан в регистр B.
3. Самостоятельно решите задачу вычисления количества единичных разрядов 8-битного двоичного числа.
Содержание отчёта
1.Титульный лист работы.
2.Формулировка цели и задач работы.
3.Описание и результаты используемых операций.
4.Краткие выводы по проделанной работе.
Контрольные вопросы
1.Перечислите известные Вам команды логических операций.
2.Выполнение каких команд может повлечь за собой установку бита нулевого результата в регистре состояния F?
3.Выполнение каких команд может повлечь за собой установку бита переноса в регистре состояния F?
4.Какие команды передачи управления Вы знаете?
ЛАБОРАТОРНАЯ РАБОТА №5 ЛОГИЧЕСКИЕ ОПЕРАЦИИ
Цель работы: изучение применения команд сдвига и ветвлений для логических операций над байтами данных.
Краткие теоретические сведения
Логическими операциями будем называть операции над отдельными битами байта данных. В программировании существует 4 разновидности логических операций: логическое « и» (AND), логическое « или» (OR), логическое « не» (отрицание, NOT) и исключающее « или» (XOR). Все операции, кроме отрицания, являются бинарными, т.е. выполняются над двумя операндами. Логическое « не» является унарной операцией, т.е. выполняется над одним операндом.
Логические операции рассмотрим применительно к отдельным битам блока данных. Это связано с тем, что логические значения представляются в памяти как один бит, нулевое значение которого соответствует логическому значению « ложь» (FALSE, или 0), а единичное – « истина» (TRUE, или 1). В табл. 1. приведены логические операции.
|
|
|
|
|
|
|
|
|
Таблица 1 |
|
|
|
|
|
Логические операции |
|
|
||
|
|
|
|
|
|
|
|
|
|
№ пп |
Операнд |
|
Операнд |
AND |
|
OR |
XOR |
NOT |
Пример |
1. |
0 |
|
0 |
0 |
|
0 |
0 |
- |
0 AND 1 = 0 |
2. |
0 |
|
1 |
0 |
|
1 |
1 |
- |
1 OR 0 = 1 |
3. |
1 |
|
0 |
0 |
|
1 |
1 |
- |
|
|
|
|
|||||||
4. |
1 |
|
1 |
1 |
|
1 |
0 |
- |
1 XOR 1 = 0 |
5. |
|
0 |
- |
|
- |
- |
1 |
NOT 1 = 0 |
|
6. |
|
1 |
- |
|
- |
- |
0 |
||
|
|
|
В языке Assembler предусмотрены некоторые команды для выполнения логических операций над байтами данных. К ним относятся команды поразрядного
логического « и», поразрядного « или» и т.п.
В данной работе Вам предстоит без использования стандартных команд логических операций осуществить эти операции над данными.
Оборудование для выполнения работы
Работа выполняется на ПК с операционной системой Windows NT/2000/XP в среде отладки CPM.
Порядок выполнения работы
1.Дано число 00000101b. Необходимо произвести логическое отрицание каждого бита этого числа. В результате должно быть получено число 11111010b.
2.Рассмотрим алгоритм работы программы, решающей данную задачу. Блок-схема алгоритма представлена на рис. 1.
3.Текст программы на языке Assembler для микропроцессора i8080 приведён ниже.
org 100h |
|
mvi A, 00000101b |
;Исходное число |
mvi B, 10000000b |
;Вспомогательное число (целая степень двух) |
mvi D,0 |
;Результат |
mvi H,8 |
;Количество итераций |
L3: |
;Возврат из конца цикла |
mvi E,0 |
;Пользовательский признак переноса |
rrc |
;Определение последнего бита числа А |
jnc L1 |
;Если последний бит 0, то пропустить mvi E,1 |
mvi E,1 |
;Установка пользовательского признака переноса |
L1: |
|
mov C,A |
;Запоминание А в С |
mov A,B |
;Вспомогательное число пишем в А |
rlc |
;"Продвижение" единицы вспомогательного |
|
;числа влево |
mov B,A |
;возврат вспомогательного числа в B |
dcr E |
;Уменьшение Е для определения признака переноса |
jz L2 |
;В случае переноса (при Е=0 после |
|
;декремента) следует пропустить два |
|
;последующих действия |
add D |
;Если переноса не было (Е=FFh после |
|
;декремента), т.е. в последнем бите |
|
;исходного числа был ноль и его необходимо |
|
;установить в 1, то А (вспомогательное |
|
;число) суммируется с предыдущим результатом |
mov D,A; |
;другими словами, к результату добавляется |
|
;соответствующая (текущая) степень двойки, |
|
;т.е. ставится единица в соответствующий бит |
L2: |
;переход по jz L2 |
mov A,C |
;возврат в А рабочее число |
dcr H |
;уменьшение счётчика на 1 |
jnz L3 |
;возврат к началу цикла |
end |
|

Рис. 1. Блок-схема алгоритма рассмотренной программы
4. В таблице 1 показан ход выполнения рассмотренной программы: содержимое регистров и флагов переноса и нулевого результата в процессе
Таблица 1
Ход выполнения программы
|
Ш |
Ите- |
|
|
|
|
|
|
|
|
№ |
а |
ра- |
A |
B |
C |
D |
E |
H |
FC |
FZ |
|
г |
ция |
|
|
|
|
|
|
|
|
1 |
1 |
1 |
0110 0101 |
0000 0000 |
0000 0000 |
0000 0000 |
0000 0000 |
0000 0000 |
0 |
0 |
2 |
2 |
1 |
0110 0101 |
1000 0000 |
0000 0000 |
0000 0000 |
0000 0000 |
0000 0000 |
0 |
0 |
3 |
3 |
1 |
0110 0101 |
1000 0000 |
0000 0000 |
0000 0000 |
0000 0000 |
0000 0000 |
0 |
0 |
4 |
4 |
1 |
0110 0101 |
1000 0000 |
0000 0000 |
0000 0000 |
0000 0000 |
0000 1000 |
0 |
0 |
5 |
5 |
1 |
0110 0101 |
1000 0000 |
0000 0000 |
0000 0000 |
0000 0000 |
0000 1000 |
0 |
0 |
6 |
6 |
1 |
1011 0010 |
1000 0000 |
0000 0000 |
0000 0000 |
0000 0000 |
0000 1000 |
1 |
0 |
7 |
8 |
1 |
1011 0010 |
1000 0000 |
0000 0000 |
0000 0000 |
0000 0001 |
0000 1000 |
1 |
0 |
8 |
9 |
1 |
1011 0010 |
1000 0000 |
1011 0010 |
0000 0000 |
0000 0001 |
0000 1000 |
1 |
0 |
9 |
10 |
1 |
1000 0000 |
1000 0000 |
1011 0010 |
0000 0000 |
0000 0001 |
0000 1000 |
1 |
0 |
10 |
11 |
1 |
0000 0001 |
1000 0000 |
1011 0010 |
0000 0000 |
0000 0001 |
0000 1000 |
1 |
0 |
11 |
12 |
1 |
0000 0001 |
0000 0001 |
1011 0010 |
0000 0000 |
0000 0001 |
0000 1000 |
1 |
0 |
12 |
13 |
1 |
0000 0001 |
0000 0001 |
1011 0010 |
0000 0000 |
0000 0000 |
0000 1000 |
0 |
1 |
13 |
17 |
1 |
1011 0010 |
0000 0001 |
1011 0010 |
0000 0000 |
0000 0000 |
0000 1000 |
0 |
1 |
14 |
18 |
1 |
1011 0010 |
0000 0001 |
1011 0010 |
0000 0000 |
0000 0000 |
0000 0111 |
0 |
0 |
15 |
5 |
2 |
1011 0010 |
0000 0001 |
1011 0010 |
0000 0000 |
0000 0000 |
0000 0111 |
0 |
0 |
16 |
6 |
2 |
0101 1001 |
0000 0001 |
1011 0010 |
0000 0000 |
0000 0000 |
0000 0111 |
0 |
0 |
17 |
9 |
2 |
0101 1001 |
0000 0001 |
0101 1001 |
0000 0000 |
0000 0000 |
0000 0111 |
0 |
0 |
18 |
10 |
2 |
0000 0001 |
0000 0001 |
0101 1001 |
0000 0000 |
0000 0000 |
0000 0111 |
0 |
0 |
19 |
11 |
2 |
0000 0010 |
0000 0001 |
0101 1001 |
0000 0000 |
0000 0000 |
0000 0111 |
0 |
0 |
20 |
12 |
2 |
0000 0010 |
0000 0010 |
0101 1001 |
0000 0000 |
0000 0000 |
0000 0111 |
0 |
0 |
21 |
13 |
2 |
0000 0010 |
0000 0010 |
0101 1001 |
0000 0000 |
1111 1111 |
0000 0111 |
1 |
0 |
22 |
15 |
2 |
0000 0010 |
0000 0010 |
0101 1001 |
0000 0000 |
1111 1111 |
0000 0111 |
0 |
0 |
23 |
16 |
2 |
0000 0010 |
0000 0010 |
0101 1001 |
0000 0010 |
1111 1111 |
0000 0111 |
0 |
0 |
24 |
17 |
2 |
0101 1001 |
0000 0010 |
0101 1001 |
0000 0010 |
1111 1111 |
0000 0111 |
0 |
0 |
25 |
18 |
2 |
0101 1001 |
0000 0010 |
0101 1001 |
0000 0010 |
1111 1111 |
0000 0110 |
0 |
0 |
26 |
5 |
3 |
0101 1001 |
0000 0010 |
0101 1001 |
0000 0010 |
0000 0000 |
0000 0110 |
0 |
0 |
27 |
6 |
3 |
1010 1100 |
0000 0010 |
0101 1001 |
0000 0010 |
0000 0000 |
0000 0110 |
1 |
0 |
28 |
8 |
3 |
1010 1100 |
0000 0010 |
0101 1001 |
0000 0010 |
0000 0001 |
0000 0110 |
1 |
0 |
29 |
9 |
3 |
1010 1100 |
0000 0010 |
1010 1100 |
0000 0010 |
0000 0001 |
0000 0110 |
1 |
0 |
30 |
10 |
3 |
0000 0010 |
0000 0010 |
1010 1100 |
0000 0010 |
0000 0001 |
0000 0110 |
1 |
0 |
31 |
11 |
3 |
0000 0100 |
0000 0010 |
1010 1100 |
0000 0010 |
0000 0001 |
0000 0110 |
0 |
0 |
32 |
12 |
3 |
0000 0100 |
0000 0100 |
1010 1100 |
0000 0010 |
0000 0001 |
0000 0110 |
0 |
0 |
33 |
13 |
3 |
0000 0100 |
0000 0100 |
1010 1100 |
0000 0010 |
0000 0000 |
0000 0110 |
0 |
1 |
34 |
17 |
3 |
1010 1100 |
0000 0100 |
1010 1100 |
0000 0010 |
0000 0000 |
0000 0110 |
0 |
1 |
35 |
18 |
3 |
1010 1100 |
0000 0100 |
1010 1100 |
0000 0010 |
0000 0000 |
0000 0101 |
0 |
0 |
36 |
5 |
4 |
1010 1100 |
0000 0100 |
1010 1100 |
0000 0010 |
0000 0000 |
0000 0101 |
0 |
0 |
37 |
6 |
4 |
0101 0110 |
0000 0100 |
1010 1100 |
0000 0010 |
0000 0000 |
0000 0101 |
0 |
0 |
38 |
9 |
4 |
0101 0110 |
0000 0100 |
0101 0110 |
0000 0010 |
0000 0000 |
0000 0101 |
0 |
0 |
39 |
10 |
4 |
0000 0100 |
0000 0100 |
0101 0110 |
0000 0010 |
0000 0000 |
0000 0101 |
0 |
0 |
40 |
11 |
4 |
0000 1000 |
0000 0100 |
0101 0110 |
0000 0010 |
0000 0000 |
0000 0101 |
0 |
0 |
41 |
12 |
4 |
0000 1000 |
0000 1000 |
0101 0110 |
0000 0010 |
0000 0000 |
0000 0101 |
0 |
0 |
42 |
13 |
4 |
0000 1000 |
0000 1000 |
0101 0110 |
0000 0010 |
1111 1111 |
0000 0101 |
1 |
0 |
43 |
15 |
4 |
0000 1010 |
0000 1000 |
0101 0110 |
0000 0010 |
1111 1111 |
0000 0101 |
0 |
0 |
44 |
16 |
4 |
0000 1010 |
0000 1000 |
0101 0110 |
0000 1010 |
1111 1111 |
0000 0101 |
0 |
0 |
45 |
17 |
4 |
0101 0110 |
0000 1000 |
0101 0110 |
0000 1010 |
1111 1111 |
0000 0101 |
0 |
0 |
46 |
18 |
4 |
0101 0110 |
0000 1000 |
0101 0110 |
0000 1010 |
1111 1111 |
0000 0100 |
0 |
0 |
выполнения программы. Жирным шрифтом выделены изменения, вносимые каждой командой. Подчёркиванием выделен текущий результат. В этой таблице показано выполнение примерно половины программы. В столбце D строки 44 можно увидеть, что младшие 4 бита исходного байта изменились на противоположные значения. Если продолжить выполнение программы, то изменятся и старшие 4 бита в соответствии с заданным алгоритмом, и конечный результат будет равен 10010101b.
5. Самостоятельно опишите алгоритм и реализующую его программу для записи бит исходного числа в обратном порядке (например, для числа 10010101b результат должен быть 10101001b).
Содержание отчёта
1.Титульный лист работы.
2.Формулировка цели и задач работы.
3.Описание и результаты используемых операций.
4.Краткие выводы по проделанной работе.
Контрольные вопросы
1.Перечислите основные логические операции.
2.Каково отличие операции логического « или» от операции исключающего логического « или»?
3.Какие команды языка Assembler предназначены для выполнения логических операций?
4.По какому критерию при использовании команд логических операций выбирается позиция операндов в логическом выражении?
ЛАБОРАТОРНАЯ РАБОТА №6 ОБРАБОТКА МАССИВОВ ДАННЫХ
Цель работы: изучение механизмов записи и чтения массивов данных.
Краткие теоретические сведения
Любые данные в вычислительных системах обрабатываются в кристалле микропроцессора, а хранятся в памяти [6-8]. Для обмена данными между процессором и памятью предусмотрены команды записи и чтения содержимого ячеек памяти. Для выполнения операций над содержимым памяти соответствующие ячейки считываются в регистры микропроцессора, где производятся арифметические или логические действия над данными. После этого полученные результаты снова записываются в память.
Обрабатываемые данные, как правило, организованы в виде массивов, и обращение к ним как к операндам выполняется последовательно в соседние ЯП.
Это свойство называется пространственной локальностью данных [1,2].
Свойство пространственной локальности данных удобно использовать при обработке последовательного потока данных большого объёма. В этом случае в качестве адресов операндов в командах микропроцессора используется содержимое ячеек памяти или регистров, указанных в команде. Такой вид адресации операндов называется косвенной или косвенно-регистровой адресацией [1,2].
При косвенной адресации в качестве операндов команд указаны ячейки памяти или регистры, в которых содержится адреса целевых операндов. При организации многократного доступа к соседним ячейкам памяти достаточно создать цикл в программе с увеличением содержимого регистров или ячеек памяти, выступающих в роли операндов команд микропроцессора. Таким образом, на каждом шаге цикла будет производиться доступ к разным ячейкам памяти при указании одного и того же операнда в команде микропроцессора.
Принцип работы указанной технологии рассмотрим на примере обработки массива данных.
Оборудование для выполнения работы
Работа выполняется на ПК с операционной системой Windows NT/2000/XP в среде отладки CPM.
Порядок выполнения работы
1.Рассмотрим пример обработки числового массива. Дан массив с начальным адресом 200h и длиной 8 (данные массива занимают 8 соседних ячеек памяти с адресами 200h, 201h, …, 207h). Необходимо записать в массив с начальным адресом 2A0h чётные элементы первого массива.
2.Алгоритм работы программы, выполняющей данную задачу, следующий. Устанавливаются адрес первого элемента исходного массива и первый адрес нового массива. Далее организуется цикл. В начале цикла элемент исходного массива с указанным адресом проверяется на чётность путём сдвига вправо. Если элемент чётный, то его значение записывается в ЯП с адресом, указанным
вкачестве адреса второго массива, после чего адрес нового массива увеличивается на 1. Далее адрес исходного массива увеличивается на 1, а счётчик цикла, изначально равный известному априори количеству элементов в исходном массиве, уменьшается на 1. Если значение счётчика не достигло нуля, то происходит возврат в начало цикла.
3.Блок-схема алгоритма рассматриваемой программы показана на рис. 1.
4.Текст программы, реализующей данный алгоритм, приведён ниже.
org 100h |
|
|
mvi A,1 |
|
|
sta 200h |
|
|
mvi A,5 |
|
;Запись |
sta 201h |
|
;в память |
. |
|
;элементов |
. |
|
;исходного |
. |
|
;массива |
mvi A,30h |
|
|
sta 207h |
|
|
mvi B,8 |
|
;Инициализация счётчика цикла |
lxi H,200h |
;Установка начального адреса исходного массива |
|
lxi D,2A0h |
;Установка начального адреса целевого массива |
|
M1: |
|
;Начало цикла |
mov A,M |
|
;Запись в A текущего элемента исходного массива |
rrc |
;Сдвиг содержимого A вправо для проверки на чётность |
|
jc M2 |
;Если число нечётное, то последующие три |

|
;действия не выполняются |
mov A,M |
;В аккумулятор снова записывается элемент массива |
stax D |
;и записывается в целевой массив |
inx D |
;Увеличение адреса целевого массива |
M2: |
|
inx H |
;Увеличение адреса исходного массива |
dcr B |
;Уменьшение счётчика цикла |
jnz M1 |
;Возврат в начало цикла, если счётчик не достиг нуля |
hlt |
|
Рис. 1. Блок-схема алгоритма программы
5.Результатом работы программы является массив с начальным адресом 2A0h, в который записаны чётные элементы исходного массива.
6.Самостоятельно составьте алгоритм и программу для нахождения нечётных элементов массива.
Содержание отчёта
1.Титульный лист работы.
2.Формулировка цели и задач работы.
3.Описание и результаты используемых операций.
4.Краткие выводы по проделанной работе.
Контрольные вопросы
1.Опишите механизм обмена данными между массивами.
2.Приведите примеры практически важных задач, при решении которых применяются технологии работы с массивами.
3.Опишите синтаксис и назначение используемых в работе команд.