Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное_пособие.doc
Скачиваний:
70
Добавлен:
10.11.2019
Размер:
8.13 Mб
Скачать
    1. Методы адресации. Форматы команд

При создании программы для микроконтроллера на языке Ассемблер разработчик оперирует программно доступными ресурсами микропроцессорной системы. У микроконтроллера ATmega16 эти ресурсы включают: программно доступные регистры микроконтроллера и внутреннюю память данных.

Каждая команда языка Ассемблер “сообщает” процессору выполняемую операцию и методы доступа к операндам или место размещения операндов.

Обрабатываемые в процессоре микроконтроллера данные (операнды) могут располагаться в регистрах РОН, в ячейках памяти или в регистрах ввода/вывода. В вычислительной системе с общей шиной данных, к которой относится и микроконтроллер, любой из этих источников данных имеет уникальный адрес. Способ задания адреса операнда (способ адресации) определяется командой. Название способа адресации определяется, в основном, местом размещения операнда.

Напоминаем, что команда может размещаться в одной или двух ячейках программной памяти, т.е. имеет длину 16 или 32 разряда. Часть разрядов команды, называемая кодом операции (КОП), определяет вид выполняемой процессором операции: сложение, вычитание, сдвиг, пересылка и др. Эти разряды поступают на входы дешифратора выбора устройства в АЛУ: сумматор, комплект схем И, комплект схем ИЛИ и др. . Кроме того, код операции определяет способ адресации операндов. Другая часть разрядов является кодом адреса или кодом операнда .

Регистровая адресация. Операнд(ы) размещаются в регистрах РОН. Адрес(а) регистров указываются в команде соответствующими разрядами команды. Пример двухоперандной команды сложения двух регистров ADD Rd,Rr (результат помещается в регистр на место первого операнда). Символы ddddd определяют адрес регистра хранения первого операнда. Символы rrrrr определяют адрес регистра хранения второго операнда. Выполняемая операция условно обозначается следующим образом: Rd Rd + Rr – сложение значений в регистрах Rd и Rr и помещение результата в регистр Rd.

Номера

Разрядов

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Команда

0

0

0

0

1

1

r

d

d

d

d

d

r

r

r

r

Разряды кода

операции (КОП)

Адрес регистра Rd

(операнда 1)

Адрес регистра Rr (операнда 2)

К адресным входам мульти-

плексоров выбора регистров РОН

Рисунок 6

Разряды команды 15-19 - поле кода операции. Часть этих разрядов подключена к АЛУ и предназначена для выбора устройства в АЛУ (в данном случае в АЛУ будет выбран сумматор). Разряды адреса регистра второго операнда (rrrrr) разъединены. Помещение результата операции на место регистра первого операнда определяется кодом операции. Если первый операнд хранится в регистре r6 (адрес 00110), а второй – в регистре r23 (адрес 10111), то код команды будет 0000 1110 0110 0111 или $0E67. Результат будет помещен в регистр r6.

Пример однооперандной команды INC Rd - добавить единицу в регистр РОН. Выполняемая операция RdRd+1. Формат команды имеет вид, представленный на рис. 7.

Номера

Разрядов

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Команда

1

0

0

1

0

1

0

d

d

d

d

d

0

0

1

1

Разряды кода

операции

Адрес регистра РОН

Разряды кода

операции

Рисунок 7

Рисунок 8

Непосредственная адресация. Операнд находится в самой команде и размещается за кодом операции. Особенностью микроконтроллеров семейства AVR является использование в командах с непосредственной адресацией только регистров R16 – R31. Примером команды с непосредственной адресацией является команда загрузки регистра байтом. Ассемблерная запись этой команды LDI Rd,D8. Условная запись операции: RdD8 (восьмиразрядные данные помещаются в регистр Rd). Формат команды приведен на рисунке 9.

Номера

разрядов

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Команда

1

1

1

0

D 7

D6

D5

D4

d

d

d

d

D3

D2

D1

D0

Описа-ние

Код

операции

Старшие разряды операнда D8

Адрес регистра

R16 –R31

Младшие разряды операнда D8

Рисунок 9

Разряды операнда D8 разнесены по команде по четыре разряда. Адрес регистра указывается только четырьмя его младшими разрядами (старший разряд адреса регистра РОН равный 1 определяется кодом операции). Для конкретной команды LDI R21,$D7(шестнадцатиричный операнд D7 загружается в регистр R21) код команды: 1110 1101 0101 0111 или $ED77. Здесь третья тетрада 0101 – младшие разряды номера регистра R21. Можно сказать, что старший разряд адреса регистра R21 равный единице определяется “по умолчанию”. Следовательно, получается адрес регистра 10101=21.

Прямая адресация. Операнд выбирается или помещается в ячейку памяти данных (ОЗУ, РОН или регистр ВВ), адрес которой находится в самой команде. Этот способ адресации используется практически только при обращениях к ячейкам ОЗУ. Такие команды занимают две ячейки программной памяти (два слова или четыре байта или 32 разряда). Первое слово – собственно команда, а второе слово является адресом ячейки памяти данных. Формат двухсловной команды пересылки (сохранения) содержимого регистра в ячейку ОЗУ LDS Rd,ADR имеет вид:

Первое слово команды:

Номера

разрядов

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Команда

1

0

0

1

0

0

1

d

d

d

d

d

0

0

0

0

Описа-ние

Разряды кода

операции

Адрес регистра Rd

Разряды кода

операции

Рисунок 10

Второе слово команды:

Номера

разрядов

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Описа-ние

Адрес ячейки памяти данных

Рисунок 11

16-разрядный адрес ячейки памяти ОЗУ, из которой будет считываться содержимое, содержится во втором слове команды. Команда занимает две ячейки программной памяти и выполняется за два цикла. Выполняемая по команде операция Rd(ADR) – загрузить регистр РОН из ячейки ОЗУ, адрес которой в команде.

Примечание: запомнить!!!!: символом “( )” обозначается ячейка памяти, а значение в скобках является адресом ячейки или указывает на место размещения адреса ее.

Пример: LDS R4,100 – загрузить R4 содержимым ячейки ОЗУ, адрес которой 100 (100 – десятичное значение). Код команды : 1001 0010 0100 0000 0000 0000 0110 0100 или $9240 0064.

Косвенная регистровая адресация. Операнд выбирается из ячейки или помещается в ячейку памяти, адрес которой находится в регистре, определяемом кодом операции. В качестве адресного регистра может использоваться любой из регистров X,Y,Z. Пример команды LDS Rd,X. Выполняемая операция: Rd(X) - загрузка регистра Rd содержимым ячейки ОЗУ, адрес которой выбирается из регистра Х. Формат команды приведен на рисунке 12.

Номера

Разрядов

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Команда

1

0

0

1

0

0

0

d

d

d

d

d

1

1

0

0

Описа-ние

Разряды кода

операции

Адрес регистра - приемника Rd

Разряды кода

операции

Рисунок 12

Разряды кода операции распределены по коду команды. Используемый в качестве адресного регистр (X,Y,Z) определяется кодом операции.

Косвенная адресация к памяти данных с постинкрементом и преддекрементом. Эти способы являются разновидностями способа косвенной регистровой адресации. В случае постинкремента после выполнения пересылки операнда, с использованием косвенно адресуемой ячейки, содержимое адресного регистра (X,Y,Z) увеличивается на единицу, а в случае преддекремента предварительно содержимое адресного регистра уменьшается на единицу, а потом производится обращение к ячейке памяти (запись или считывание). Такой способ адресации позволяет ускорить доступ к массивам данных (становится не нужной команда инкремента или декремента адреса ячейки). Формат команд аналогичен формату с косвенной регистровой адресацией. Примеры команд:

LD Rd,X+ Rd(X), X+1

ST -Y,Rr Y-1, (Y)Rr

Косвенная адресация к памяти данных со смещением. Этот способ является также косвенным, но адрес ячейки памяти является суммой содержимого регистра Y или Z и смещения q, заданного в самой команде. Для смещения используются шесть разрядов, следовательно, предельные значения смещения 0 и 63.

Пример команды: LDD Rd,Z+q Выполняемая операция: Rd(Z+q) – загрузка регистра РОН из ячейки памяти, адрес которой является суммой содержимого регистра Z и смещения q.

Формат команды (рисунок 13), кроме кода операции содержит шесть разрядов смещения и пять разрядов адреса регистра РОН.

Номера

Разрядов

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Команда

1

0

q

0

q

q

0

d

d

d

d

d

0

q

q

q

Описа-ние

Разряды кода операции

и старшие разряды q

Адрес регистра - приемника

Разряды кода операции и q

Рисунок 13

Стековая адресация. Этот способ адресации является разновидностью косвенной адресации, но адрес ячейки ОЗУ (стека) выбирается из указателя стека SP. Команда загрузки в стек: PUSH Rr. Выполняемая операция: (SP)Rr, SP-1 – содержимое регистра РОН копируется в ячейку ОЗУ, адрес которой в указателе стека SP (в стек) и затем содержимое указателя стека уменьшается на 1. Формат команды аналогичен формату команды с косвенной адресацией. Указание на использование регистра SP находится в коде операции.

Команда чтения из стека: POP Rd. Выполняемая операция: SP+1, Rd(SP) – содержимое указателя стека SP увеличивается на 1 и затем содержимое ячейки ОЗУ(стека), адрес которой выбирается из указателя стека, копируется в регистр РОН Rd. Так как стек “растет” в сторону младших адресов, то целесообразно начало стека организовать в старшей ячейке ОЗУ. Так как стек используется практически в любой программе, то первыми командами должны быть команды размещения в указателе стека адреса начала стека.

Принцип стека: “ последнее загруженное значение считывается первым”.