Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
6.67 Mб
Скачать

Завдання:

Здійснити додавання двох констант, які індивідуально задаються викладачу студенту перед початком виконання лабораторної роботи. Від результату додавання відняти одну з констант і переконатися, що результатом віднімання справді буде друга константа.

Перевірити додавання і віднімання з допомогою вбудованого калькулятора операційної системи Windows (або іншими засобами, не AVR Studio).

Продемонструвати викладачеві проміжні результати додавання і віднімання. Прокоментувати хід виконання програми.

Лабораторна робота №4 «Програмування з допомогою підпрограм. Стек»

Ціль роботи

  • вивчити методику використанні підпрограм

  • ознайомитися з роботою стеку

  • вивчити методику порівняння двох двобайтинх чисел

Програма виконання роботи

- Об’явити три константи A0, DELTA і LIMIT, розмір яких не перевищує двохбайтне число

- Написати підпрограму додавання попереднього результату значення DELTA

- Припинити додавання у тому випадку. коли результатом останнього числа буде трибайтне число, або значення буде більше-рівним значення LIMIT

Додатковий теоретичний матеріал необхідний для виконання лабораторної роботи

Стек

Стек (англ. stack — стопка) — різновид лінійного списку, структура даних, яка працює за принципом «останнім прийшов — першим пішов» (LIFO, англ. last in, first out). Всі операції (наприклад, видалення елементу) в стеку можна проводити тільки з одним елементом, який знаходиться на верхівці стеку та був введений в стек останнім.

Стек можна розглядати як певну аналогію до стопки тарілок, з якої можна взяти верхню, і на яку можна покласти верхню тарілку (інша назва стеку — «магазин», за аналогією з принципом роботи магазину в автоматичній зброї)

Додавання елемента, яке називається також проштовхуванням (push), можливо тільки в вершину стека (доданий елемент стає першим зверху). Видалення елемента, яке називається також виштовхуванням (pop), теж можливо тільки з вершини стека, при цьому другий зверху елемент стає верхнім.

Стеки широко застосовуються в обчислювальній техніці. Наприклад, для відстеження точок повернення з підпрограм використовується стек викликів, який є невід'ємною частиною архітектури більшості сучасних процесорів. Мови програмування високого рівня також використовують стек викликів для передачі параметрів при виклику процедур.

Операції зі стеком

push ("заштовхнути елемент"): елемент додається в стек та розміщується в його верхівці. Розмір стеку збільшується на одиницю. При перевищенні розміру стека граничної величини, відбувається переповнення стека (англ. stack overflow)

pop ("виштовхнути елемент"): отримує елемент з верхівки стеку. При цьому він видаляється зі стеку і його місце в верхівці стеку займає наступний за ним відповідно до правила LIFO, а розмір стеку зменшується на одиницю. При намаганні "виштовхнути" елемент з вже пустого стеку, відбувається ситуація "незаповнення" стеку (англ. stack underflow)

Організація в пам'яті процесора

Стек може бути організований як масив або множина комірок в пам’яті процесора з додатковим зберіганням ще й вказівника на верхівку стека. Заштовхування першого елемента в стек збільшує адресу вказівника, виштовхування елементу зменшує її. Таким чином, адреса вказівника завжди відповідає комірці масиву, в якій зараз знаходиться верхівка стеку.

Багато процесорів ЕОМ мають спеціалізовані регістри, які використовуються як вказівники на верхівку стеку, або використовують деякі з регістрів загального призначення для цієї спеціальної функції в певних режимах адресації пам'яті.

Приклади застосування

- Стек може використовуватися для тимчасового збереження регістрів, якщо на деякий час є необхідність їх використання у інших цілях, а по завершенні певної операції треба продовжити обчислення із того значення, яке було до моменту виклику підпрограми

- Компілятори мов програмування використовують стек для передавання параметрів в процесі виклику підпрограм, процедур та функцій. Спеціалізований стек використовується також для збереження адрес повернення з підпрограм.

- Калькулятори, які використовують зворотній польський запис, використовують стек для збереження даних обчислень.

- Існують «стеко-орієнтовані» мови програмування (Forth, PostScript), які використовують стек як базову структуру даних при виконанні багатьох операцій (арифметичних, логічних, вводу-виводу тощо).

- Стеко-орієнтованими є деякі з віртуальних машин, наприклад віртуальна машина Java.

Стек у мікроконтролерах лінійки AVR

Стек використовується в основному для зберігання тимчасових даних, для зберігання локальних змінних і для зберігання адрес повернення після переривання і виклики підпрограм. Регістром вказівника стека (SP) завжди вказує на вершину стека. Слід зазначити, що стек реалізований у вигляді заповнення з вищих комірок пам'яті до нижніх комірок пам'яті. Це означає, що команда стека PUSH зменшує по абсолютній величині значення, яке зберігається у регістрі SP.

SP вказує на стек у SRAM області. Ця область стеку повинна бути визначеною з допомогою програми до того у SRAM7, перед тим, як підпрограми будуть викликатися або будуть дозволені переривання. Покажчик стека зменшується на одиницю, коли дані в стек «заштовхуються» PUSH інструкцією, і зменшується на два, коли адреса повернення «заштовхується» в стек з викликом підпрограми або переривання. Покажчик стека збільшується на одиницю, коли дані «виштовхуються» з стека інструкцією POP, і збільшується на два, коли дані «виштовхуються» з стеку з поверненням з підпрограми RET інструкцією або виходом з переривання RETI інструкцією.

Покажчик AVR стек реалізований як два 8-розрядних регістрів вводу/виводу. Зверніть увагу, що SRAM в деяких AVR-мікроконтролдерах8 настільки мала, що тільки SPL необхідно. В цьому випадку, E wmjve dbgflre SPH не буде присутнім.

15

14

13

12

11

10

9

8

SP15

SP14

SP13

SP12

SP11

SP10

SP9

SP8

SPH

SP7

SP6

SP5

SP4

SP3

SP2

SP1

SP0

SPL

7

6

5

4

3

2

1

0

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Запис/Читання

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Запис/Читання

0

0

0

0

0

0

0

0

По замовчуванню

0

0

0

0

0

0

0

0

По замовчуванню

Пам’ять AVR мікроконтролера ATMEGA128

Архітектура AVR мікроконтролерів має два області пам’яті, Пам’ять Даних (Data Memory – англ.; надалі DM) і Пам’ять Програм (Program Memory – англ.; надалі PM). Додатково ATMEGA128 має EEPROM пам’ять

Пам’ять даних

32 регістри

$0000 - $001F

64 регістри вводу/виводу

$0020 - $005F

160 розширені регістри вводу/виводу

$0060 - $00FF

Внутрішня SRAM

$0100 - $10FF

Зовнішня SRAM

$1100 -

- $FFFF

Перші 32 комірки DM займає Регістровий файл (32 регістри загального призначення R0 – R31), Регістри вводу/виводу (доступ до них можна здійснювати як інструкціями IN і OUT так і інструкціями непрямої адресації ST/STS/STD LD/LDS/LDD), Розширені регістри вводу/виводу (доступ до них можна тільки інструкціями непрямої адресації ST/STS/STD LD/LDS/LDD), 4096 комірки внутрішньої SRAM, до 64 Кбайт зовнішньої SRAM

Способи адресації DM

Існує п’ять способів адресації DM:

- пряма адресація

- непряма адресація з зсувом

- непряма адресація

- непряма адресація з pre9-декрементацією10

- непряма адресація з post11-інкрементацією12

З регістрового файлу регістри R26 – R31 використовуються як регістри-вказівники.

Пряма адресація адресує весь адресний простір.

Непряма адресація з зсувом адресує 63 комірки адресного простору відносно базової адреси, яка визначається Y- чи Z-регістри.

Коли використовується непряма адресація з автоматичною pre-декрементацією і post-інкрементацією, адресні регістри X, Y і Z декрементуються чи інкрементуються.

Регістри вводу/виводу (які треба знати при виконанні цієї лабораторної роботи)

Адреса

Номер регістру вводу/виводу13

Назва

Біт 7

Біт 6

Біт 5

Біт 4

Біт 3

Біт 2

Біт 1

Біт 0

Буде описано пізніше або можна ознайомитися з опису до мікроконтролера ATMEGA128

$5F

$3F

SREG

I

T

H

S

V

N

Z

C

$5E

$3E

SPH

SP15

SP14

SP13

SP12

SP11

SP10

SP9

SP8

$5D

$3D

SPL

SP7

SP6

SP5

SP4

SP3

SP2

SP1

SP0

Буде описано пізніше або можна ознайомитися з опису до мікроконтролера ATMEGA128

Директива INCLUDE«Включити інший файл»

Ця директива вказує AVR Studio-асемблеру почати читати з вказаного файлу. Тоді AVR Studio-асемблер асемблює визначений файл поки не буде зафіксовано кінець файлу (EOF) чи EXIT14-директива. Визначений файл, у свою чергу також може містити директиви INCLUDE

Синтаксис:

.INCLUDE “ім’я файлу

Наприклад:

.INCLUDE "m128def.inc"

Це корисно!

Для зручності використання AVR Studio при написанні програм для різних мікроконтролерів, у яких регістри вводу/виводу чи розширених регістрів вводу/виводу, а також деяких пере позначень регістрів регістрового файлу (зокрема X, Y і Z), абсолютні адреси яких у різних мікроконтролерах можуть бути різні, але назва і функціональне призначення є однакове – розробниками AVR Studio у папці \Program Files\Atmel\AVRTools\AVRAssembler\Аppnotes\ знаходяться *.inc файли у яких директивами EQU і DEF15 описані визначені всі регістри і відповідні біти регістрів, а також здійснено деякі визначення.

Серед визначених констант є константа RAMEND, значення якої є номер останньої комірки SRAM. Цю константу зручно використовувати для ініціалізації стеку.

Для того, щоб включити у проект визначення регістрів мікроконтролера ATMEGA128 треба в проект включити m128def.inc файл.

Опис деяких мнемонік інструкцій, які використовуються у цій лабораторній роботі і не були описані у описах до попередніх лабораторних робіт

IN – «Загрузити вмістиме регістрів вводу/виводу у регістр загального призначення»

Інструкція загружає вмістиме з регістрів вводу/виводу у регістр загального призначення

Rd ← I/O (A)

Синтаксис

Операнди

Лічильник команд

IN Rd, A

0 d ≤ 31, 0 ≤ A ≤63

PC  ← PC + 1

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

in r25, $16

OUT – «Записали вмістиме регістру загального призначення у регістр вводу/виводу»

Інструкція записує вмістиме з регістру загального призначення у регістр вводу/виводу

I/O (A) ← Rr

Синтаксис

Операнди

Лічильник команд

OUT A, Rr

0 r ≤ 31, 0 ≤ A ≤63

PC  ← PC + 1

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

out $16, r25

RCALL16 – «Відносний перехід до підпрограми»

Інструкція здійснює відносний перехід до підпрограми у адресному у інтервалі PC – 2K + 1 і PC +2K (слів). Адреса повернення записується у стек (тому вказівник на стек SP має бути визначеним) У асемблері мітка використовується для визначення імені підпрограми, куди треба перейти Для AVR мікроконтролерів з пам’яттю програм не більшою 4К слів (8К байт) ця інструкція може адресувати пам’ять з будь-якого місця програми (будь-якої комірки пам’яті програм). Вказівник на стек при виконанні цієї інструкції здійснює post-декрементацію.

PC ← PC + k + 1

Синтаксис

Операнди

Лічильник команд

Стек

RCALL k

-2K ≤ k ≤ 2K

PC ← PC + k + 1

STACK ← PC + 1

SP ← SP - 2

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

rcall routine

routine: push r14

pop r14

ret

RET – «Вихід з підпрограми»

Інструкція здійснює вихід з підпрограми. Адреса повернення вигружається зі стеку. Вказівник на стек при виконанні цієї інструкції здійснює pre-інкрементацію

PC(15:0) ← STACK

Синтаксис

Операнди

Лічильник команд

Стек

RET

Нема

PC(15:0) ← STACK

SP ← SP + 2

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

rcall routine

routine: push r14

pop r14

ret

PUSH – «“Заштовхати” регістр у стек»

Інструкція записує вмістиме регістра Rr у стек. Вказівник на стек при виконанні цієї інструкції здійснює post-декрементацію на 1 після виконання цієї інструкції.

STACK ← Rr

Синтаксис

Операнди

Лічильник команд

Стек

PUSH Rr

0 ≤ r ≤ 31

PC ← PC + 1

SP ← SP - 1

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

rcall routine

routine: push r14

pop r14

ret

POP – «“Виштовхати” регістр зі стеку»

Інструкція записує у регістр Rd байт із вершини стек. Вказівник на стек при виконанні цієї інструкції здійснює pre-інкрементацію на 1 перед виконання цієї інструкції.

Rd ← STACK

Синтаксис

Операнди

Лічильник команд

Стек

POP Rd

0 ≤ d ≤ 31

PC ← PC + 1

SP ← SP + 1

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

rcall routine

routine: push r14

pop r14

ret

TST – «Тестування на НУЛЬ або МІНУС»

Інструкція записує перевірку чи є вмістиме регістру нуль чи від’ємне число. Ця інструкція здійснює логічне І між регістром і ним самим. При цьому вмістиме регістру не змінюється

Rd ← Rd & Rd

Синтаксис

Операнди

Лічильник команд

TST Rd

0 ≤ d ≤ 31

PC ← PC + 1

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

<>

0

<>

<>

-

Біт S:

S = N ^ V. Використовується для тестування знаку результату.

Біт V:0

Очищується.

Біт N:

Встановлюється, якщо MSB встановлений, у іншому випадку – скидається.

Біт Z:

Встановлюється, якщо результатом є число $00, у іншому випадку – скидається.

Наприклад:

tst r0 ; Тестування r0

BRSH – «Перейти, якщо рівне більше чи рівне (беззнакове)»

Інструкція умовного відносного переходу. Вона перевіряє біт (C) і здійснює перехід відносно вмістимого регістру лічильника команд (PC), якщо біт C очищений. Якщо ця інструкція виконується зразу після будь-яких цих інструкцій CP, CPI, SUB чи SUBI – перехід відбудеться, якщо беззнакове ціле число представлене у Rd було більше чи рівне беззнаковому цілому числу представленому у Rr. Ця інструкція здійснює відносний перехід відносно регістра PC у будь-якому напрямку (PC – 63 ≤ PC +64). Параметр k є зміщенням відносно PC і представляється у додатковому коді. (Ця інструкція є еквівалентною інструкції BRBС 0,k)

якщо Rd ≥ Rr (С = 0) тоді PC ← PC + k + 1 інакше PC  ← PC + 1

Синтаксис

Операнди

Лічильник команд

BRSH k

-64 ≤ k ≤ +63

PC ← PC + k + 1

PC  ← PC + 1, якщо умова не справджується

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

loop: ldi r1, r0

cpi r19, $10

brsh loop

nop

BRLO – «Перейти, якщо менше (беззнакове)»

Інструкція умовного відносного переходу. Вона перевіряє біт (C) і здійснює перехід відносно вмістимого регістру лічильника команд (PC), якщо біт C встановлений. Якщо ця інструкція виконується зразу після будь-яких цих інструкцій CP, CPI, SUB чи SUBI – перехід відбудеться, якщо беззнакове ціле число представлене у Rd було менше беззнаковому цілому числу представленому у Rr. Ця інструкція здійснює відносний перехід відносно регістра PC у будь-якому напрямку (PC – 63 ≤ PC +64). Параметр k є зміщенням відносно PC і представляється у додатковому коді. (Ця інструкція є еквівалентною інструкції BRBS 0,k)

якщо Rd < Rr (С = 1) тоді PC ← PC + k + 1 інакше PC  ← PC + 1

Синтаксис

Операнди

Лічильник команд

BRLO k

-64 ≤ k ≤ +63

PC ← PC + k + 1

PC  ← PC + 1, якщо умова не справджується

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

loop: ldi r1, r0

cpi r19, $10

brlo loop

nop

BRMI – «Перейти, якщо від’ємне»

Інструкція умовного відносного переходу. Вона перевіряє біт (N) і здійснює перехід відносно вмістимого регістру лічильника команд (PC), якщо біт N встановлений. Ця інструкція здійснює відносний перехід відносно регістра PC у будь-якому напрямку (PC – 63 ≤ PC +64). Параметр k є зміщенням відносно PC і представляється у додатковому коді. (Ця інструкція є еквівалентною інструкції BRBS 2,k)

якщо N = 1 тоді PC ← PC + k + 1 інакше PC  ← PC + 1

Синтаксис

Операнди

Лічильник команд

BRMI k

-64 ≤ k ≤ +63

PC ← PC + k + 1

PC  ← PC + 1, якщо умова не справджується

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

loop: ldi r1, r0

cpi r19, $10

brmi loop

nop

BRPL – «Перейти, якщо додатнє»

Інструкція умовного відносного переходу. Вона перевіряє біт (N) і здійснює перехід відносно вмістимого регістру лічильника команд (PC), якщо біт N очищений. Ця інструкція здійснює відносний перехід відносно регістра PC у будь-якому напрямку (PC – 63 ≤ PC +64). Параметр k є зміщенням відносно PC і представляється у додатковому коді. (Ця інструкція є еквівалентною інструкції BRBC 2,k)

якщо N = 0 тоді PC ← PC + k + 1 інакше PC  ← PC + 1

Синтаксис

Операнди

Лічильник команд

BRPL k

-64 ≤ k ≤ +63

PC ← PC + k + 1

PC  ← PC + 1, якщо умова не справджується

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

loop: ldi r1, r0

cpi r19, $10

brpl loop

nop

BRGE – «Перейти, якщо рівне більше чи рівне (знакове)»

Інструкція умовного відносного переходу. Вона перевіряє біт (S) і здійснює перехід відносно вмістимого регістру лічильника команд (PC), якщо біт S очищений. Якщо ця інструкція виконується зразу після будь-яких цих інструкцій CP, CPI, SUB чи SUBI – перехід відбудеться, якщо знакове ціле число представлене у Rd було більше чи рівне знаковому цілому числу представленому у Rr. Ця інструкція здійснює відносний перехід відносно регістра PC у будь-якому напрямку (PC – 63 ≤ PC +64). Параметр k є зміщенням відносно PC і представляється у додатковому коді. (Ця інструкція є еквівалентною інструкції BRBС 4,k)

якщо Rd ≥ Rr ((N^V) = 0) тоді PC ← PC + k + 1 інакше PC  ← PC + 1

Синтаксис

Операнди

Лічильник команд

BRGE k

-64 ≤ k ≤ +63

PC ← PC + k + 1

PC  ← PC + 1, якщо умова не справджується

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

loop: ldi r1, r0

cpi r19, $10

brge loop

nop

BRLT – «Перейти, якщо менше (знакове)»

Інструкція умовного відносного переходу. Вона перевіряє біт (S) і здійснює перехід відносно вмістимого регістру лічильника команд (PC), якщо біт S встановлений. Якщо ця інструкція виконується зразу після будь-яких цих інструкцій CP, CPI, SUB чи SUBI – перехід відбудеться, якщо знакове ціле число представлене у Rd було менше знаковому цілому числу представленому у Rr. Ця інструкція здійснює відносний перехід відносно регістра PC у будь-якому напрямку (PC – 63 ≤ PC +64). Параметр k є зміщенням відносно PC і представляється у додатковому коді. (Ця інструкція є еквівалентною інструкції BRBS 4,k)

якщо Rd < Rr ((N^V) = 1) тоді PC ← PC + k + 1 інакше PC  ← PC + 1

Синтаксис

Операнди

Лічильник команд

BRLT k

-64 ≤ k ≤ +63

PC ← PC + k + 1

PC  ← PC + 1, якщо умова не справджується

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

-

-

Наприклад:

loop: ldi r1, r0

cpi r19, $10

brlt loop

nop

CPI – «Порівняння регістра зі константою»

Ця інструкція здійснює порівняння двох регістра Rd і константи. Регістр при цьому не змінюється. Всі інструкції переходу з умовою можуть бути використані після цієї інструкції

Rd - K

Синтаксис

Операнди

Лічильник команд

CPI Rd,K

16 ≤ d ≤ 31, 0 ≤ K ≤ 255

PC ← PC + 1

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

<>

<>

<>

<>

<>

<>

Наприклад:

cpi r16, $17

CPC – «Порівняння регістрів із врахуванням біту переносу»

Ця інструкція здійснює порівняння двох регістрів Rd і Rr і також враховується попередній перенос старшого розряду. Ні один регістр при цьому не змінюється. Всі інструкції переходу з умовою можуть бути використані після цієї інструкції

Rd – Rr - C

Синтаксис

Операнди

Лічильник команд

CPC Rd,Rr

0 ≤ d ≤ 31, 0 ≤ r ≤ 31

PC ← PC + 1

Вплив на регістри статусу:

I

T

H

S

V

N

Z

C

-

-

<>

<>

<>

<>

<>

<>

Наприклад:

cpc r4, r19