LDI R16, 5 ; предел повторений цикла

Ldi R17, 100 ; число, заносимое в массив array

Ldi R18, 1

Ldi R30, low(array) ; младший байт адреса массива array

Ldi R31, high(array) ; старший байт адреса массива array

loop: ; тело цикла

St Z, R17 ; занесение числа 100 в массив array

Add R30, R18 ; адрес следующего байта массива array

sub R16, R18 ; счётчик числа проходов, шаг равен -1

brne loop ; повторить, если счётчик не равен нулю

; ...

Рис. 22. Фрагмент программы циклической обработки массива

Таблица 5

№ вар. Число Массив I Массив II № вар. Число Массив I Массив II
13; 78; 1; 24; 18 81; 10; 201; 33; 8 65; 2; 43; 10; 125 84; 95; 5; 116; 48
5; 61; 75; 17; 27 42; 137; 72; 9; 53 14; 23; 83; 30; 66 47; 50; 36; 21; 74
33; 44; 29; 81; 20 7; 100; 38; 49; 99 34; 18; 136; 27; 5 94; 52; 47; 85; 21
24; 31; 6; 55; 71 30; 127; 23; 8; 17 23; 75; 30; 15; 41 110; 4; 39; 40; 33
68; 41; 25; 13; 57 48; 4; 15; 36; 121 71; 52; 19; 24; 88 37; 44; 26; 60; 18
45; 55; 2; 109; 33 9; 57; 15; 22; 207 49; 117, 29; 6; 21 51; 14; 57; 23; 48
23; 13; 67; 39; 48 47; 180; 3; 10; 55 83; 16; 54; 27; 30 94; 35; 76; 55; 81
34; 92; 8; 20; 71 36; 76; 23; 99; 40 37; 65; 29; 86; 24 81; 23; 70; 64; 32
28; 0; 139; 36; 17 128; 35; 5; 68; 72 51; 36; 48; 25; 80 78; 94; 8; 24; 128
61; 40; 22; 27; 66 59; 31; 129; 18; 63 13; 41; 27; 82; 77 53; 67; 15; 56; 30
7; 56; 29; 16; 104 87; 23; 90; 44; 62 94; 2; 17; 38; 45 17; 0; 49; 69; 32
49; 24; 49; 84; 15 75; 3; 12; 64; 227 6; 60; 73; 18; 44 100; 22; 37; 9; 56
51; 33; 19; 48; 80 145; 26; 1; 13; 88 48; 14; 23; 50; 65 62; 58; 46; 59; 33
67; 30; 25; 52; 38 35; 62; 8; 59; 46 31; 52; 17; 24; 78 3; 88; 53; 162; 72
120; 36; 7; 10; 45; 53; 47; 35; 62; 81 66; 70; 42; 13; 29 42; 15; 76; 38; 86

3. В последнем варианте программы исключить команду inc за счёт использования косвенной адресации памяти данных с постинкрементом.

4. Изменить порядок подсчёта числа проходов цикла, задав изменение параметра цикла (счётчика) не с предела, а с нуля.

5. Составить программу пересылки массива из памяти программ в память данных. Массив в памяти программ задать директивой .db; значения элементов массива взять из табл. 5 (массив I) в соответствии с заданным вариантом.

6. Составить программу суммирования элементов массива. Значения элементов массива задать аналогично п. 5.

7. Составить программу поэлементного сложения двух массивов. Значения элементов массивов взять из табл. 5 (массив I и массив II) в соответствии с заданным вариантом.

8. Составить программу слияния двух массивов, где в результате попарного сравнения двух элементов из разных массивов образуется новый массив из наибольших элементов. Значения элементов массивов взять аналогично п. 7.

СОДЕРЖАНИЕ ОТЧЁТА

Отчёт должен содержать: титульный лист с указанием номера и названия лабораторной работы, номера группы и фамилий выполнивших работу; цель работы; листинги трансляции программ в соответствии с заданием.

КОНТРОЛЬНЫЕ ВОПРОСЫ

1.Наиболее распространённые алгоритмические структуры.

2.Назначение и общая структура циклических программ.

3.Команды, используемые для организации ветвлений и циклов.

4.Назначение и выполнение команд безусловных переходов.

5.Назначение и выполнение команд условных переходов.

6.Использование кодов (флагов) условий в командах условных переходов.

Работа № 5. ОРГАНИЗАЦИЯ ПОДПРОГРАММ

Цель работы: изучение принципов организации подпрограмм и передачи параметров; освоение команд, обеспечивающих взаимодействие вызывающей программы с подпрограммой.

ОСНОВНЫЕ СВЕДЕНИЯ

В большой и сложной программе можно выделить последовательности команд, выполняющие некоторые законченные функции (процедуры). Если такие последовательности команд оформить в виде отдельных модулей – подпрограмм (routine, subroutine), то в программе эти команды могут быть заменены вызовами соответствующих подпрограмм. Такое модульное (структурное) программирование даёт следующие преимущества:

- ускоряется и упрощается отладка всей программы;

- подпрограммы, реализующие универсальные функции, могут использоваться при разработке других программ;

- в одной программе могут быть объединены модули, полученные после трансляции программ, написанных на разных языках программирования.

Для взаимодействия вызывающей программы с подпрограммой необходимо выполнение следующих условий:

- вызывающей программе должно быть известно положение подпрограммы в общей структуре программы;

- должны быть определены способы вызова подпрограммы и возврата из неё;

- должен быть выбран способ обмена данными между вызывающей программой и подпрограммой.

Положение подпрограммы в общей структуре программы определяется по её имени. Имя подпрограммы на ассемблере, задаваемое символической меткой, является стартовым адресом исполняемой части подпрограммы.

Вызов подпрограммы подразумевает передачу в неё управления ходом выполнения команд. Передача управления осуществляется путём загрузки в программный счётчик (РС) стартового адреса подпрограммы. При этом необходимо обеспечить сохранение адреса возврата из подпрограммы, т. е. адреса команды, следующей за командой вызова подпрограммы. Для хранения адресов возврата из подпрограмм используется стек (stack).

Стек – специальным образом организованная последовательность ячеек памяти с дисциплиной обслуживания «последним пришёл – первым вышел» (LIFO: Last-In – First-Out). При занесении в стек новых данных предыдущие данные сохраняются, но становятся временно недоступными («опускаются»). Выгружаются из стека («поднимаются», «выталкиваются») данные в обратном порядке. Стек может быть реализован как аппаратно, так и программно. Аппаратный стек (Hardware Stack) выполняется непосредственно в составе процессора в виде набора специальных регистров и, как правило, имеет небольшую глубину. Программный стек (Software Stack) организуется в оперативной памяти; глубина определяется размером и степенью использования памяти.

Адрес очередной свободной ячейки стека содержится в специальном регистре – указателе стека SP (Stack Pointer). При записи в стек число помещается в ячейку с адресом, содержащимся в указателе стека, после чего содержимое указателя стека уменьшается на единицу (рис. 23, а). При чтении из стека производится выборка содержимого ячейки по адресу, на единицу большему содержимого указателя стека (рис. 23, б). Таким образом, при записи стека и чтении из него содержимое указателя стека изменяется.

Механизм использования стека для хранения адресов возврата из подпрограмм состоит в следующем. Когда в программе встречается команда вызова подпрограммы, в ячейку памяти, определяемую указателем стека, записывается адрес возврата; значение указателя стека декрементируется; в программный

LDI R16, 5 ; предел повторений цикла - student2.ru Рис. 23. Операции записи в стек (а) и чтения из стека (б):

*** – очередная свободная ячейка стека; Addr – адрес

счётчик загружается стартовый адрес подпрограммы. Далее выполняются команды подпрограммы. Когда в подпрограмме встречается команда возврата в вызывающую программу, значение указателя стека инкрементируется; сохранённый в стеке адрес возврата загружается в программный счётчик (рис. 24). Использование стека для работы с подпрограммами позволяет одной подпрограмме вызывать другую, т. е. обеспечивает возможность вложения подпрограмм. Глубина вложения подпрограмм ограничивается размером стека.

LDI R16, 5 ; предел повторений цикла - student2.ru

Рис. 24. Механизм вызова подпрограммы и возврата в вызывающую программу

В большинстве AVR-микроконтроллеров стек размещается в оперативной памяти. Указатель стека представляет собой пару 8-разрядных регистров SPH (старший байт указателя стека) и SPL(младший байт указателя стека), находящихся в адресном пространстве регистров ввода-вывода. В микроконтроллерах, размер оперативной памяти которых не превышает 256 байт, для хранения указателя стека используется только один регистр SPL (SP). Микроконтроллеры, не имеющие оперативной памяти, содержат трёхуровневый аппаратный стек.

Организуемый в оперативной памяти стек «растёт» от старших адресов к младшим. Учитывая, что начальное значение указателя стека после сброса микроконтроллера равно нулю, в инициализирующей (начальной) части программы необходимо произвести его установку, если предполагается использование хотя бы одной подпрограммы. При организации стека во внутренней оперативной памяти это может быть сделано, например, следующим образом:

Наши рекомендации