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

Завдання:

1. Об’явити однобайтну константу N.

2. У сегменті пам’яті даних об’явити однобайтні змінні a і b, які за умовами цієї лабораторної роботи будемо розглядати, як знакові однобайтні змінні26

3. Проініціалізувати вказівник на стек у останню комірку внутрішньої SRAM

4. Реалізувати цикл, який на мові програмування C мав би такий вигляд:

for (unsigned char27 i = 0; i < N; i++)

{

будь-які операції28

}

5. Реалізувати цикл, який на мові програмування C мав би такий вигляд:

for (unsigned char29 i = N; i > 0; i--)

{

будь-які операції30

}

6. Реалізувати цикл, який на мові програмування C мав би такий вигляд:

for (unsigned char31 i = 0; i < N; i +=2)

{

будь-які операції32

}

6.1  При виконанні цього варіанту циклу треба врахувати той факт, що при збільшенні параметру i (який розглядається як без знаковим однобайтним числом)на 2, можливий випадок, що ми отримаємо двохбайтне число. Тоді молодший байт у робочому регістрі буде меншим за константу N, але оскільки є перенос у старші розряди, то, фактично результуюче число більше за константу N. Тому при написанні програми у асемблері для AVR мікроконтролерів треба слідкувати за тим чи при додаванні не виник перенос у старші розряди і при його фіксації виходити із циклу.

7. Реалізувати цикл, який на мові програмування C мав би такий вигляд:

for (unsigned cha33r i = 0; i < N; i++)

{

будь-які операції34

if (a35 < 17) continue;

if (b36 < 18) break;

будь-які операції37

}

7.1  При моделюванні і демонстрації викладачеві роботу операторів continue і break слід використовувати вікно Watch AVR Studio, тобто зупинити програму, встановити досліджувальні величини змінних і продемонструвати правильну роботу цих операторів continue і break

8. Реалізувати цикл, який на мові програмування C мав би такий вигляд:

while (a38 >= b39)

{

будь-які операції40

}

9. Реалізувати цикл, який на мові програмування C мав би такий вигляд:

do

{

будь-які операції41

}

while (a42 < b43)

Лабораторна робота №7 «Вивчення алгоритму множення двобайтинх знакових чисел»

Ціль роботи

  • вивчити інструкції множення AVR-мікроконтролерів

  • вивчити алгоритм множення двобайтних чисел з допомогою математики однобайтних чисел

  • закріпити знання про відмінність між знаковими і без знаковими числами

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

- Реалізувати алгоритм множення двох знакових двобайтних чисел.

- Результат записати у оперативну пам'ять мікроконтролера

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

Правило прогнозування максимально-можливого результату при множення

При множенні N-розрядного числа на M-розрядне число максимально-можливим результатом може бути (N+M)-розрядне число.

Методика множення двох двобайтних знакових чисел

Нехай ми маємо два знакових числа A і B

Старший байт

Молодший байт

A

B15

B14

B13

B12

B11

B10

B9

B8

B7

B6

B5

B4

B3

B2

B1

B0

S44

Біти, які відповідають за модуль числа

Старший байт

Молодший байт

B

B15

B14

B13

B12

B11

B10

B9

B8

B7

B6

B5

B4

B3

B2

B1

B0

S45

Біти, які відповідають за модуль числа

Позначимо молодший байт числа A AL, а старший байт – AH

Відповідно позначимо BL і BH – молодший і старший байти числа B

Тоді ми можемо записати:

Тоді:

Як видно, операцію множення двобайтних чисел можна звести до:

1) Множення однобайтних чисел

2) Операцій зсуву46

3) Додавання відповідних байт між собою

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

S

S

x

C-біт( и)

C-біт(и)

$00

$00

Множення двох беззнакових чисел

$00 або $FF

Множення знакового і беззнакового числа

$00 або $FF

Множення знакового і беззнакового числа

Множення двох знакових чисел

+

Четвертий (старший) байт результату

Третій байт результату

Другий байт результату

Перший (молодший) байт результату

Для того, щоб перемножити два знакові двобайтні числа однобайтною арифметикою треба:

1) Перемножити відповідні байти між собою

2) При множенні треба слідкувати за тим, чи всі біти числа відповідають за модуль (тоді це число треба розглядати, як беззнакове), чи старший біт однобайтного вибраного числа відповідає не за знак, а за модуль (тоді це число треба розглядати, як знакове)

3) Просумувати відповідні байти між собою.

4) При сумуванні треба враховувати, що може відбутися перенос у старші розряди, тобто при сумуванні треба додавати не тільки відповідні байти але і розряд(и), які мають додатися до даних байт і походять з переповнення під час формуванні попереднього байту результату.

Ще одним важливим аспектом, який треба врахувати, що для того, щоб отримати правильний результат, то треба мати на увазі, що, хоч при множенні двох однобвайтних чисел достатньо результат записати двобайтним числом, але, якщо уважно подивитися на сему множення, то можна побачити:

Для формування першого (молодшого) байту треба

взяти перший байт результату множення

Для формування другого байту треба додати

другий байт результату множення байт результату множенная і байт результату множенная

Для формування третього байту треба додати

третій байт результату множення байт результату множенная , другий байт результату множенная і байт результату множенная

Для формування четвертого байту треба додати

четвертий байт результату множення третій байт результату множенная , третій байт результату множенная і байт результату множенная

Треба звернути особливу увагу на байти, які відмічені жирним шрифтом. Формально вони є зайвими. Але якщо звернути увагу на те, що множення у нас відбувається знакових чисел, а тоді від’ємні числа представляються у додатковому коді. Це означає, що коли ми хочемо , наприклад, однобайтне знакове число представити у вигляді двобайтного знакового числа, то:

- для додатного числа треба другий (старший) байт записати $00

Наприклад:

$07 → $00 07

- для від’ємного числа треба другий (старший) байт записати $FF

Наприклад:

$FE → $FF FE

У випадку коли множення є беззнакових чисел, то результатом буде додатне число, а тоді при розширенні на старші байти треба дописувати $00, яке для прикінцевого додавання не буде мати особливу вагу. Тому нас не має особливо цікавити третій і четвертий байт результату множення

У випадку коли множення є знакових чисел, або знакового числа з беззнаковим числом, то результатом буде або додатне число, або від’ємне (у залежності від того, чи знакове число було додатне чи від’ємне), а тоді при розширенні на старші байти треба дописувати або $00 (у випадку, якщо результатом множення є додатне число), або $FF (у випадку, якщо результатом множення є від’ємне число) – і це є дуже важливо при прикінцевому додаванні: чи додавати число $00, чи число $FF. Тому нас не має особливо цікавити треті байти результатів у множення

Якщо цей аспект не врахувати, то правильними результатами будуть тільки множення додатних чисел.

Ще на що особливо треба звернути увагу, що:

1) нам треба отримати результат додавання трьох байт

2) оскільки AVR-мікроконтролер «вміє» додавати тільки два регістри між собою, то для додавання трьох байт треба використати два рази інструкцію додаванні AVR-мікроконтролера

3) при додаванні двох байт між собою результат може бути 9-ти бітне число. При додаванні трьох байт між собою максимально можливий прогнозований результат може бути 10-ти бітне число.

4) Перенос треба врахувати при формуванні наступного байту результату а не при формуванні результату, для якого виконується дане додавання трьох байт. Тому треба реалізувати алгоритм, який би «запам’ятовував» всі переноси (у нашому випадку максимально можлива кількість 2) і їх враховував при формуванні наступного байту остаточного результату множення.

5) Оскільки інше правило говорить, що при множенні 16-ти бітного числа на 16-ти бітне число, максимально можливий результат може бути -ти бітне число – тобто 4 байти, то при формуванні останнього байту не обов’язково слідкувати за переносом у п’ятий байт, бо, якщо він і буде, то це буде біт, який повторює останній біт 4-ри бітного числа (біт знаку).

Деякі рекомендації для полегшення написання програми в AVR Assembler

У цій роботі є необхідність використовувати велику кількість регістрів, кожен з яких має своє смислове навантаження. Щоб програму зробити більш зручною для читання варто використати директиви AVR Assembler .DEF і .UNDEF. Перша з яких дозволяє поставити у відповідність регістру якусь комбінацію символів (пере назвати регістр), а друга – відмінити це назначення.

Директива .DEF описана у додатковому теоретичному матеріалі для лабораторної роботи № 5 «Вивчення роботи з пам’яттю даних»

Директива UNDEF«Відміна встановлення символьного значення вибраному регістрові»

Ця директива є доступною тільки при використанні AVRASM2 (використовується AVR Studio v.4.18 по замовчуванню)

Ця директива використовується для відміни символьного назначення регістру, попередньо використовуваною директивою .DEF.

Синтаксис:

.UNDEF Символьне ім’я

Наприклад:

.DEF temp = R16

.UNDEF temp

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

MUL – «Множення беззнакових чисел»

Ця інструкція здійснює множення 8-и бітного числа з 8-и бітним числом. Результатом буде 16-и бітне беззнакове число.

Rd

Rr

R1

R0

Множене

Множник

Старший байт результату

Молодший байт результату

8-біт

8-біт

16-біт

Множене (регістр Rd) і множник (регістр Rr) – це два регістри у яких зберігаються беззнакові числа. 16-ти бітний беззнаковий добуток поміщається у регістр R1 (старший байт добутку) і R0 (молодший байт добутку). Якщо множене чи множник розміщений у регістрі R0 чи R1, то результат обновить ці значення у цих регістрах після множення.

R1:R0 ← Rd x Rr (беззнакове число ← беззнакове число x беззнакове число)

Синтаксис

Операнди

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

MUL Rd,Rr

0 ≤ d ≤ 31, 0 ≤ r ≤ 31

PC ← PC + 1

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

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

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

<>

<>

Біт Z:

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

Біт  C:

Встановлюється якщо біт 15 результату встановлюється, у іншому разі - скидається.

Наприклад:

mul r16,r17 ;Множення регістрів r16 і r17

MULS – «Множення знакових чисел»

Ця інструкція здійснює множення 8-и бітного числа з 8-и бітним числом. Результатом буде 16-и бітне знакове число.

Rd

Rr

R1

R0

Множене

Множник

Старший байт результату

Молодший байт результату

8-біт

8-біт

16-біт

Множене (регістр Rd) і множник (регістр Rr) – це два регістри у яких зберігаються знакові числа. 16-ти бітний знаковий добуток поміщається у регістр R1 (старший байт добутку) і R0 (молодший байт добутку).

R1:R0 ← Rd x Rr (знакове число ← знакове число x знакове число)

Синтаксис

Операнди

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

MULS Rd,Rr

16 ≤ d ≤ 31, 16 ≤ r ≤ 31

PC ← PC + 1

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

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

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

<>

<>

Біт Z:

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

Біт  C:

Встановлюється якщо біт 15 результату встановлюється, у іншому разі - скидається.

Наприклад:

muls r16,r17 ;Множення регістрів r16 і r17

MULSU – «Множення знакового числа з беззнаковим числом»

Ця інструкція здійснює множення 8-и бітного числа з 8-и бітним числом. Результатом буде 16-и бітне число, яке є результатом множення знакового числа з беззнаковим числом.

Rd

Rr

R1

R0

Множене

Множник

Старший байт результату

Молодший байт результату

8-біт

8-біт

16-біт

Множене (регістр Rd) і множник (регістр Rr). Множене (регістр Rd) – це є знакове число, множник (регістр Rr) – беззнакове число. 16-ти бітний знаковий добуток поміщається у регістр R1 (старший байт добутку) і R0 (молодший байт добутку).

R1:R0 ← Rd x Rr (знакове число ← знакове число x беззнакове число)

Синтаксис

Операнди

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

MULSU Rd,Rr

16 ≤ d ≤ 23, 16 ≤ r ≤ 23

PC ← PC + 1

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

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

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

<>

<>

Біт Z:

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

Біт  C:

Встановлюється якщо біт 15 результату встановлюється, у іншому разі - скидається.

Наприклад:

mulsu r16,r17 ;Множення регістрів r16 і r17

FMUL – «Множення беззнакових дробових чисел»

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

Rd

Rr

R1

R0

Множене

Множник

Старший байт результату

Молодший байт результату

8-біт

8-біт

16-біт

Нехай (N.Q) позначає дробове число з N бінарними цифрами зліва від коми, яка відділяє цілу і дробові частини і Q бінарними цифрами справа від коми. Добутком між двома числами у форматах (N1.Q1) і (N2.Q2) буде формат ((N1+N2).(Q1+Q2)). Для програм, які обробляють аналогові сигнали, формат (1.7) широко використовується для вхідних сигналів, (2.14) формат результату. Зміщення вліво потрібне для старшого байту результату для того, щоб зрівняти формат результату з форматом вхідного сигналу. Інструкція FMUL з’єднує операцію зміщення разом із інструкцією MUL.

Множене Rd і множник Rr – це два регістри, які містять беззнакові дробові числа, де мається на увазі, що кома між цілою і дробовою частиною знаходиться між 6-им і 7-им бітом. Результатом є 16-и бітне беззнакове зміщене число де мається на увазі, о кома, яка розділяє цілу і дробову частину знаходиться між 14-им і 15-им бітом і записується в R1 (старший байт) і R0 (молодший байт).

R1:R0 ← Rd x Rr (беззнакове число (1.15) ← беззнакове число (1.7) x беззнакове число (1.7))

Синтаксис

Операнди

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

FMUL Rd,Rr

16 ≤ d ≤ 23, 16 ≤ r ≤ 23

PC ← PC + 1

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

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

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

<>

<>

Біт Z:

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

Біт  C:

Встановлюється якщо біт 15 результату встановлюється перед зміщенням, у іншому разі - скидається.

Наприклад:

fmul r16,r17

FMULS – «Множення знакових дробових чисел»

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

Rd

Rr

R1

R0

Множене

Множник

Старший байт результату

Молодший байт результату

8-біт

8-біт

16-біт

Нехай (N.Q) позначає дробове число з N бінарними цифрами зліва від коми, яка відділяє цілу і дробові частини і Q бінарними цифрами справа від коми. Добутком між двома числами у форматах (N1.Q1) і (N2.Q2) буде формат ((N1+N2).(Q1+Q2)). Для програм, які обробляють аналогові сигнали, формат (1.7) широко використовується для вхідних сигналів, (2.14) формат результату. Зміщення вліво потрібне для старшого байту результату для того, щоб зрівняти формат результату з форматом вхідного сигналу. Інструкція FMULS з’єднує операцію зміщення разом із інструкцією MULS.

Множене Rd і множник Rr – це два регістри, які містять знакові дробові числа, де мається на увазі, що кома між цілою і дробовою частиною знаходиться між 6-им і 7-им бітом. Результатом є 16-и бітне знакове зміщене число де мається на увазі, що кома, яка розділяє цілу і дробову частину знаходиться між 14-им і 15-им бітом і записується в R1 (старший байт) і R0 (молодший байт).

Зверніть увагу, що множення $80 (-1) з $80 (-1) – результатом операції зсуву буде $8000 (-1). Таким цином операція зсуву дає переповнення у додатковому коді. Це треба враховувати при написанні програмного забезпечення для AVR-мікроконтролера.

R1:R0 ← Rd x Rr (знакове число (1.15) ← знакове число (1.7) x знакове число (1.7))

Синтаксис

Операнди

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

FMULS Rd,Rr

16 ≤ d ≤ 23, 16 ≤ r ≤ 23

PC ← PC + 1

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

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

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

<>

<>

Біт Z:

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

Біт  C:

Встановлюється якщо біт 15 результату встановлюється перед зміщенням, у іншому разі - скидається.

Наприклад:

fmuls r16,r17

FMULSU – «Множення знакового дробового числа із беззнаковим дробовим числом»

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

Rd

Rr

R1

R0

Множене

Множник

Старший байт результату

Молодший байт результату

8-біт

8-біт

16-біт

Нехай (N.Q) позначає дробове число з N бінарними цифрами зліва від коми, яка відділяє цілу і дробові частини і Q бінарними цифрами справа від коми. Добутком між двома числами у форматах (N1.Q1) і (N2.Q2) буде формат ((N1+N2).(Q1+Q2)). Для програм, які обробляють аналогові сигнали, формат (1.7) широко використовується для вхідних сигналів, (2.14) формат результату. Зміщення вліво потрібне для старшого байту результату для того, щоб зрівняти формат результату з форматом вхідного сигналу. Інструкція FMULSU з’єднує операцію зміщення разом із інструкцією MULSU.

Множене Rd і множник Rr – це два регістри, які містять беззнакові дробові числа, де мається на увазі, що кома між цілою і дробовою частиною знаходиться між 6-им і 7-им бітом. Результатом є 16-и бітне беззнакове зміщене число де мається на увазі, о кома, яка розділяє цілу і дробову частину знаходиться між 14-им і 15-им бітом і записується в R1 (старший байт) і R0 (молодший байт).

R1:R0 ← Rd x Rr (знакове число (1.15) ← знакове число (1.7) x беззнакове число (1.7))

Синтаксис

Операнди

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

FMULSU Rd,Rr

16 ≤ d ≤ 23, 16 ≤ r ≤ 23

PC ← PC + 1

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

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

I

T

H

S

V

N

Z

C

-

-

-

-

-

-

<>

<>

Біт Z:

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

Біт  C:

Встановлюється якщо біт 15 результату встановлюється перед зміщенням, у іншому разі - скидається.

Наприклад:

fmulsu r16,r17