iTunes Gift Card (Russia) 300 рублей
iTunes Gift Card (Russia) 300 рублей


XBOX Live 2000 рублей (RUS)
XBOX Live 2000 рублей (RUS)


iTunes Gift Card (Russia) 3000 руб
iTunes Gift Card (Russia) 3000 руб


В начало

Лабораторная работа.

Методы адресации, команды передачи данных и управления

 

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

 

1.  Общие сведения

 

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

Каждая команда языка Ассемблер сообщает процессору выполняемую операцию и методы доступа к операндам. Командная строка Ассемблера включает метку (символический адрес), мнемонику (символическое имя) команды, поле операндов, комментарий [1].

Методы адресации представляют собой набор механизмов доступа к операндам. Одни из них просты и поэтому приводят к компактному формату команды и быстрому доступу к операнду, но объем доступных с их помощью ресурсов ограничен. Другие методы адресации позволяют оперировать со всеми имеющимися в системе ресурсами, но команда получается длинной, на ее ввод и выполнение тратится много времени. Набор методов адресации в каждой системе команд является компромиссным сочетанием известных механизмов адресации, выбранных проектировщиками архитектуры исходя из набора решаемых задач.

Заметим, что при двух операндах и приемнике результата имеет место трехадресная команда и каждый адрес формируется с использованием собственного метода адресации. Если адрес операнда или приемника результата не указан в команде, а подразумевается, то имеет место неявная адресация. В программах для микроконтроллера ATmega128 используется прямая, косвенная и относительная адресации. На рис.14 – 25 приведены схемы методов адресации.

 

 

 

 

 

 

 

 

 


Рис. 14. Регистровая адресация (один регистр общего назначения)

 

 

 

 

 

 

 

 

 

 


Рис. 15. Регистровая адресация (два регистра общего назначения)

 

 

 

 

 

 

 

 

 

 

 


Рис. 16. Регистровая адресация (регистры ввода-вывода)

 

 

 

 

 

 

 

 

 

 


Рис. 17. Прямая адресация данных

 

 

 

 

 

 

 

 

 


Рис. 18. Косвенная адресация данных со смещением

 

 

 

 

 

 

 

 

 

 


Рис. 19. Косвенная адресация данных

 

 

 

 

 

 

 

 

 

 

 


Рис. 20. Косвенная адресация данных с преддекрементом

 

 

 

 

 

 

 

 

 

 


Рис. 21. Косвенная адресация данных с постинкрементом

 

 

 

 

 

 

 

 

 


Рис. 22. Адресация константы в памяти программ в командах LPM и ELPM

 

 

 

 

 

 

 

 

 

 

 

 

 


Рис. 23. Прямая адресация  памяти программ в командах JMP и CALL

 

 

 

 

 

 

 

 

 


Рис. 24. Косвенная адресация  памяти программ в командах IJMP и ICALL

 

 

 

 

 

 

 

 

 

 

 


Рис. 25. Относительная адресация памяти программ  в командах RJMP и RCALL

Команды передачи данных приведены в табл. 2.


Таблица. Команды пересылки данных

Мнемо-ника

Операн-ды

Описание

Операция

Флаги

Кол-во циклов

1

2

3

4

5

6

ELPM

Расширенная загрузка из памяти программ в регистр R0

R0 ¬ (Z+RAMPZ)

Нет

3

MOV

Rd,Rr

0£d£31

0£r£31

Копировать регистр

Rd ¬ Rr

Нет

1

LDI

Rd,K

16£d£31

0£k£255

Загрузить непосредственное значение

Rd ¬ K

Нет

1

LDS

Rd,k

0£d£31

0£k£65535

Загрузить из ОЗУ

Rd ¬ (k)

Нет

3

LD

Rd,X

0£d£31

Загрузить косвенно

Rd ¬ (X)

Нет

2

LD

Rd,X+

0£d£31

Загрузить косвенно с постинкрементом

Rd ¬ (X),

X ¬ X+1

Нет

2

LD

Rd,-X

0£d£31

Загрузить косвенно с преддекрементом

X ¬ X - 1,

Rd ¬ (X)

Нет

2

LD

Rd,Y

0£d£31

Загрузить косвенно

Rd ¬ (Y),

Нет

2

LD

Rd,Y+

0£d£31

Загрузить косвенно с постинкрементом

Rd ¬ (Y),

Y ¬ Y+1

Нет

2

LD

Rd,-Y

0£d£31

Загрузить косвенно с преддекрементом

Y ¬ Y - 1,

Rd ¬ (Y)

Нет

2

LDD

Rd,Y+q

0£d£31

0£q£63

Загрузить косвенно со смещением

Rd ¬ (Y+q)

Нет

2

LD

Rd,Z

0£d£31

Загрузить косвенно

Rd ¬ (Z)

Нет

2

LD

Rd,Z+

0£d£31

Загрузить косвенно с постинкрементом

Rd ¬ (Z),

Z ¬ Z+1

Нет

2

LD

Rd,-Z

0£d£31

Загрузить косвенно с преддекрементом

Z ¬ Z - 1,

Rd ¬ (Z)

Нет

2

LDD

Rd,Z+q

0£d£31

0£q£31

Загрузить косвенно со смещением

Rd ¬ (Z+q)

Нет

2

STS

k,Rr

0£r£31

0£k£65535

Загрузить непосредственно в ОЗУ

(k) ¬ Rr

Нет

3

 

Окончание табл. 2

1

2

3

4

5

6

ST

X,Rr

0£r£31

Записать косвенно

(X) ¬ Rr

Нет

2

ST

X+,Rr

0£r£31

Записать косвенно с постинкрементом

(X) ¬ Rr,

X ¬ X + 1

Нет

2

ST

-X,Rr

0£r£31

Записать косвенно с преддекрементом

X ¬ X - 1,

(X) ¬ Rr

Нет

2

ST

Y,Rr

0£r£31

Записать косвенно

(Y) ¬ Rr

Нет

2

ST

Y+,Rr

0£r£31

Записать косвенно с постинкрементом

(Y) ¬ Rr,

Y ¬ Y + 1

Нет

2

ST

-Y,Rr

0£r£31

Записать косвенно с преддекрементом

Y ¬ Y - 1,

(Y) ¬ Rr

Нет

2

STD

Y+q,Rr

0£r£31

0£q£63

Записать косвенно со смещением

(Y+q) ¬ Rr

Нет

2

ST

Z,Rr

0£r£31

Записать косвенно

(Z) ¬ Rr

Нет

2

ST

Z+,Rr

0£r£31

Записать косвенно с постинкрементом

(Z) ¬ Rr,

Z ¬ Z + 1

Нет

2

ST

-Z,Rr

0£r£31

Записать косвенно с преддекрементом

Z ¬ Z - 1,

(Z) ¬ Rr

Нет

2

STD

Z+q,Rr

0£r£31

0£q£63

Записать косвенно со смещением

(Z+q) ¬ Rr

Нет

2

LPM

 

Загрузить байт из памяти программ

R0 ¬ (Z)

Нет

3

IN

Rd,P

0£d£31

0£P£63

Загрузить данные из порта I/O  в регистр

Rd ¬ P

Нет

1

OUT

P,Rr

0£r£31

0£P£63

Записать данные из регистра в порт I/O

P ¬ Rr

Нет

1

PUSH

Rr

0£r£31

Сохранить регистр в стеке

STACK ¬ Rr

Нет

2

POP

Rd

0£d£31

Выгрузить регистр из стека

Rd ¬ STACK

Нет

2

 

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

Команды ELPM и LPM выполняют загрузку памяти программ. Команда MOV копирует содержимое одного регистра общего назначения в другой. Команда LDI загружает регистр общего назначения непосредственно константой (только R16 – R32), а команды LD выполняют загрузку регистра из ячейки ОЗУ при косвенной адресации, используя в качестве источника адреса регистры X, Y, Z, а также варианты с постинкрементом и преддекрементом источника. Команда LDD выполняет эту же операцию при помощи косвенной адресации со смещением. Команда LDS загружает в регистр общего назначения содержимое прямо адресуемой ячейки памяти данных.

Команда ST выполняет обратную операцию относительно LD – заносит в косвенно адресуемую ячейку памяти данных содержимое регистра общего назначения, используя также варианты с постинкрементом и преддекрементом адреса. Команда STD выполняет эту же операцию при помощи косвенной адресации со смещением, а команда STS прямо адресует ячейку ОЗУ.

Команда IN заносит содержимое регистра ввода-вывода в регистр общего назначения, а команда OUT выполняет обратную операцию.

Команда PUSH сохраняет содержимое регистра в стеке, а команда POP выполняет обратную операцию. При выполнении этих команд кроме программного счетчика изменяется и значение указателя стека SP.

Команды передачи управления (переходов) приведены в табл. 3.

 

Таблица. Команды переходов

Мнемо-ника

Операнды

Описание

Операция

Флаги

Кол-во циклов

1

2

3

4

5

6

RJMP

k

-2K£k£2K

Перейти относительно

PC ¬ PC + k + 1

Нет

2

LJMP

 

Перейти косвенно

PC ¬ Z

Нет

2

JMP

k

0£k£4M

Перейти

PC ¬ k

Нет

3

RCALL

K

-2K£k£2K

Вызвать подпрограмму относительно

PC ¬ PC + k + 1

Нет

3

ICALL

Вызвать подпрограмму косвенно

PC ¬ Z

Нет

3

CALL

K

0£k£64K

Выполнить длинный вызов подпрограммы

PC ¬ k

Нет

4

RET

Вернуться из подпрограммы

PC ¬ STACK

Нет

4

RETI

Вернуться из прерывания

PC ¬ STACK

1

4

CPSE

Rd,Rr

0£d£31, 0£r£31

Сравнить и пропустить, если равно

if Rd=Rr then

PC ¬PC + 2 (or 3)

Нет

1/2/3

SBRC

Rr,b

0£r£31

0£b£7

Пропустить, если бит в регистре очищен

if Rr(b)=0 then

PC ¬PC + 2 (or 3)

Нет

1/2/3

 

Продолжение табл. 3

1

2

3

4

5

6

SBRS

Rr,b

0£r£31

0£b£7

Пропустить, если бит в регистре установлен

if Rr(b)=1 then

PC ¬PC + 2 (or 3)

Нет

1/2/3

SBIC

P,b

0£P£31

0£b£7

Пропустить, если бит в регистре I/O очищен

if I/OP(b)=0 then

PC ¬PC + 2 (or 3)

Нет

1/2/3

SBIS

P,b

0£r£31

0£b£7

Пропустить, если бит в регистре I/O установлен

if I/OP(b)=1 then

PC ¬PC + 2 (or 3)

Нет

1/2/3

BRBS

s,k

0£s£7

-64£k£+63

Перейти, если бит в регистре статуса установлен

if  SREG(s)=1 then

PC ¬ PC + k + 1

Нет

1/2

BRBC

s,k

0£s£7

-64£k£+63

Перейти, если бит в регистре статуса очищен

if  SREG(s)=0 then

PC ¬ PC + k + 1

Нет

1/2

BREQ

k

-64£k£+63

Перейти, если равно

if  Rd=Rr(Z=1) then

PC ¬ PC + k + 1

Нет

1/2

BRNE

k

-64£k£+63

Перейти, если не равно

if  Rd¹Rr(Z=0) then

PC ¬ PC + k + 1

Нет

1/2

BRCS

k

-64£k£+63

Перейти, если флаг переноса установлен

if  С=1 then

PC ¬ PC + k + 1

Нет

1/2

BRCC

k

-64£k£+63

Перейти, если флаг переноса очищен

if  С=0 then

PC ¬ PC + k + 1

Нет

1/2

BRSH

k

-64£k£+63

Перейти, если равно или больше (без знака)

if  Rd³Rr (C=0) then

PC ¬ PC + k + 1

Нет

1/2

BRLO

k

-64£k£+63

Перейти, если меньше

(без знака)

if  Rd<Rr (C=1) then

PC ¬ PC + k + 1

Нет

1/2

BRMI

k

-64£k£+63

Перейти, если минус

if  N=1 then

PC ¬ PC + k + 1

Нет

1/2

BRPL

k

-64£k£+63

Перейти, если плюс

if  N=0 then

PC ¬ PC + k + 1

Нет

1/2

BRGE

k

-64£k£+63

Перейти, если больше или равно (с учетом знака)

if  Rd³Rr (NÅV=0) then

PC ¬ PC + k + 1

Нет

1/2

BRLT

k

-64£k£+63

Перейти, если меньше, чем (со знаком)

if  Rd<Rr (NÅV=1) then

PC ¬ PC + k + 1

Нет

1/2

BRHS

k

-64£k£+63

Перейти, если флаг полупереноса установлен

if  H=1 then

PC ¬  PC + k + 1

Нет

1/2

BRHC

k

-64£k£+63

Перейти, если флаг полупереноса очищен

if  H=0 then

PC  ¬ PC + k + 1

Нет

1/2

BRTS

k

-64£k£+63

Перейти, если флаг T

 установлен

if  T=1 then

PC ¬  PC + k + 1

Нет

1/2

 

 

Окончание табл. 3

1

2

3

4

5

6

BRTC

k

-64£k£+63

Перейти, если флаг T очищен

if  T=0 then

PC  ¬ PC + k + 1

Нет

1/2

BRVS

k

-64£k£+63

Перейти, если флаг переполнения установлен

if  V=1 then

PC ¬  PC + k + 1

Нет

1/2

BRVC

k

-64£k£+63

Перейти, если флаг переполнения  очищен

if  V=0 then

PC ¬  PC + k + 1

Нет

1/2

BRIE

k

-64£k£+63

Перейти, если глобальное прерывание разрешено

if  I=1 then

PC ¬  PC + k + 1

Нет

1/2

BRID

k

-64£k£+63

Перейти, если глобальное прерывание запрещено

if  I=0 then

PC ¬  PC + k + 1

Нет

1/2

 

Из табл. 2 и 3 видно, что команды пересылки данных и команды переходов значения флагов регистра SREG не изменяют.

 

2. Домашнее задание

 

1. Изучить описание структуры микроконтроллера ATmega128 и интегрированной системы его программирования на языке Ассемблер AVRStudio.

2. Изучить реализуемые микроконтроллером способы адресации и команды пересылки данных.

 

3. Порядок выполнения работы

 

1. Запустить на персональном компьютере интегрированную систему программирования AVRStudio. Командой Project | New Project создать новый проект Lesson1. С использованием редактора текста создать демонстрационную программу:

 

.device ATmega128

.include "m128def.inc"

 

;***** Инициализация указателя стека **********************

ldi R20,$FF; загрузка промежуточного регистра R20 младшим

; байтом адреса начала стека

out SPL,R20; загрузка младшего байта указателя стека

ldi R20,$10; загрузка промежуточного регистра R20 старшим

; байтом адреса начала стека

out SPH,R20; загрузка старшего байта указателя стека

;***** Выполнение команд пересылок **************************

ldi R20,$57; загрузка регистра R20 константой

ldi R30,$00;загрузка регистровой пары Z (R30,R31) с адресом $0100

ldi R31,$01;по которому расположена первая ячейка внутреннего ОЗУ

st Z,R20   ;загрузка косвенно адресуемой ячейки ОЗУ с адресом $0100

; значением из регистра R20 ($57)

lds R19,$0100 ; загрузка регистра R19 из ячейки ОЗУ с адресом $0100

sts $0101,R19;загрузка ячейки с адресом $0101 из регистра R19

call Rout   ; вызов подпрограммы Rout

loop:

rjmp loop   ; зацикливание программы

;*** Подпрограмма копирования значения из памяти программ ***

Rout:

push R30    ; сохранение указателя Z в стеке

push R31

ldi  R20, $00; загрузка регистра R20 новой константой

ldi  R30, $80; загрузка регистровой пары Z удвоенным адресом ячейки

ldi  R31, $00; памяти программ

lpm          ; загрузка регистра R0 значением ячейки памяти программ с адресом $0040

cpse R0,R20 ; пропустить следующую команду

;если значения регистров R0 и R20 равно

sts $0102,R0 ; загрузка ячейки ОЗУ с адресом $0102 из регистра R0

pop R31      ; извлечение указателя Z из стека

pop R30

ret          ; возврат из подпрограммы

;*********************************************************

2. Выполнить команду Project/Build для компиляции проекта.

3. С помощью команды Debug/Start Debugging запустить симулятор. Командой View/Memory открыть окно с ячейками памяти программ. Прямым редактированием занести любой код в ячейку $40 памяти программ.

4. Выполнить программу по шагам, выполняя команду Debug/Step Intro (F11). После выполнения текущей команды курсор в окне редактора текста указывает на следующую команду.

5.  Проверить правильность пересылки данных.

6. Составить программу выполнения заданной преподавателем последовательности операций передачи данных, провести пошаговый прогон программы, продемонстрировать полученный результат.