Кочегаров И.И. Микроконтроллеры AVR. Лабораторный практикум (2012) (1264221), страница 14
Текст из файла (страница 14)
Прямая регистровая адресация РОН применяется во всехарифметических и логических командах, а также в некоторых командах работы с битами, так как эти команды выполняются в АЛУ только над содержимым РОН. Команды, вторым операндом которых является константа, могут использовать в качестве первого операндатолько регистры из старшей половины РОН (R16…R31).817Команда415КОПРОН0R009 5415КОПdОперанд7КомандаrdRdR31а)РОН0R00Операнд 1RdОперанд 2RrR31б)Рис. 19. Прямая регистровая адресация одного (а) и двух (б) РОНПри прямой регистровой адресации регистра ввода-выводаоперанд содержится в регистре ввода-вывода, указанном в команде.Адрес регистра ввода-вывода хранится в шести разрядах слова команды (рис.
20, на котором n определяет адрес регистра-источникаили регистра-приемника в РОН). Прямая регистровая адресация регистров ввода-вывода используется в командах чтения IN и записиOUT регистра ввода-вывода, а также в ряде других команд работы срегистрами ввода-вывода.7Команда515КОПnРегистрыввода-вывода000PОперандP63Рис. 20. Прямая регистровая адресация регистра ввода-выводаПримеры использования прямой регистровой адресации:; прямая регистровая адресация одного РОНCLR R1; очистка всех разрядов регистра R1; прямая регистровая адресация двух РОНADD R11, R12; сложение содержимого регистров R11 и R12Для адресации оперативной памяти данных используютсяпять способов адресации: непосредственная, косвенная, косвенная сосмещением, косвенная с предекрементом и косвенная с постинкрементом.1.
При непосредственной адресации оперативной памяти данных операндом является содержимое ячейки ОЗУ, адрес которой ука82зан в команде. Адрес операнда содержится в 16 младших разрядах32-разрядной команды (рис. 21, на котором Rr/Rd определяет адресрегистра-источника или регистра-приемника в РОН). Непосредственная адресация используется в команде LDS (Load Direct from DataSpace) загрузки из ОЗУ и в команде STS (Store Direct to Data Space)загрузки в ОЗУ. Зарезервировать байты в ОЗУ позволяет директива.byte. Для того чтобы на выделенную область памяти можно былоссылаться, директиве .byte должна предшествовать метка.
Директива .byte имеет один параметр – количество выделяемых байт – иможет использоваться только в сегменте данных, определяемом с помощью директивы .dseg (data segment). Задать требуемое размещение выделяемой области памяти позволяет директива .org (origin –смещение). Начало программного сегмента указывается с помощьюдирективы .cseg (code segment).
Директивы .dseg и .cseg неимеют параметров. Выделенные в оперативной памяти данных байтыне инициализируются.7Команда3120 190$000016КОП Rr/RdАдрес15ОЗУОперандАдрес0$FFFFРис. 21. Непосредственная адресация ячейкиоперативной памяти данныхПример использования непосредственной адресации:; непосредственная адресация.dseg; сегмент данных (оперативная памятьданных).org $0065; по адресу $0065cnt1:.byte 1; резервирование 1 байта для cnt1.cseg; программный сегмент (память программ);...LDS R10, cnt1 ; загрузка cnt1 в R10832. При косвенной адресации оперативной памяти данных операндом является содержимое ячейки ОЗУ, адрес которой находится врегистре X, Y или Z (рис.
22). Косвенная адресация используется вкоманде LD (Load Indirect) косвенной загрузки из ОЗУ и команде ST(Store Indirect) косвенной загрузки в ОЗУ.Команда150КОП7ОЗУ$0000Rr/RdОперанд0150АдресАдресРегистр X, Y или Z$FFFFРис. 22. Косвенная адресация оперативной памяти данныхПример использования косвенной адресации:; косвенная адресация.dsegмять данных)cnt1: .byte 1; сегмент данных (оперативная па; резервирование 1 байта для cnt1.cseg; программный сегмент (память программ);...LDI R30, low(cnt1) ; загрузка в R30 младшего байта адресаcnt1LDI R31, high(cnt1) ; загрузка в R31 старшего байта адреса cnt1LD R1, Z; загрузка cnt1 в R1, т.
е. R1 <- (R31:R30)В приведенном примере использованы функции low и high,возвращающие соответственно младший и старший байты выражения (в данном случае – адреса ячейки памяти с символическим именем cnt1).3. При косвенной адресации оперативной памяти данных сосмещением адрес операнда в оперативной памяти данных вычисляется путем прибавления к содержимому регистра Y или Z смещения,указанного в команде. Смещение содержится в шести разрядах словакоманды (рис. 23). Косвенная адресация со смещением используетсяв команде LDD (Load Indirect with Displacement) косвенной загрузкииз ОЗУ со смещением и в команде STD (Store Indirect with Displacement) косвенной загрузки в ОЗУ со смещением.84Команда1565 010nКОП7ОЗУ0$0000aОперанд+15Адрес + a0Адрес$FFFFРегистр Y или ZРис.
23. Косвенная адресация оперативной памяти данныхсо смещениемПример использования косвенной адресации со смещением:; косвенная адресация со смещением.dseg; сегмент данных (оперативная память данных)arr: .byte 5; резервирование 5 байт для массива arr.cseg; программный сегмент (память программ)LDI R30, low(arr) ; загрузка в R30 младшего байта адреса arrLDI R31, high(arr) ; загрузка в R31 старшего байта адреса arr;...LDD R10, Z + 0 ; загрузка первого элемента массива arr в R10LDD R11, Z + 1 ; загрузка второго элемента массива arr в R114. При косвенной адресации оперативной памяти данных спредекрементом (лат. decrementum – уменьшение, убыль) перед выполнением команды содержимое указанного в команде регистра X, Yили Z декрементируется (уменьшается на единицу); декрементированное содержимое регистра X, Y или Z является адресом операнда воперативной памяти данных (рис.
24). Косвенная адресация с предекрементом используется в команде LD косвенной загрузки из ОЗУи команде ST косвенной загрузки в ОЗУ.; косвенная адресация с предекрементомLD R10, -Z; Z <- Z – 1, R10 <- (Z)Команда1515КОПАдрес7n0$000000ОперандРегистр X, Y или Z1ОЗУАдрес – 1$FFFF+Рис.
24. Косвенная адресация оперативной памятиданных с предекрементном855. При косвенной адресации оперативной памяти данныхс постинкрементом (лат. incrementum – увеличение, рост) адресомоперанда в оперативной памяти данных является содержимое регистра X, Y или Z, указанного в команде; после выполнения командысодержимое регистра X, Y или Z инкрементируется, т. е.
увеличивается на единицу (рис. 25). Косвенная адресация с постинкрементомиспользуется в команде LD косвенной загрузки из ОЗУ и команде STкосвенной загрузки в ОЗУ. Например:; косвенная адресация с постинкрементомLD R10, Z+; R10 <- (Z), Z <- Z + 1Команда15КОПn1570ОЗУ0$00000АдресРегистр1ОперандАдресX, Y или Z$FFFF+Рис. 25. Косвенная адресация оперативной памятиданных с постинкрементомДля адресации памяти программ используется непосредственная адресация, косвенная адресация, относительная адресация,адресация константы и адресация константы с постинкрементом.При непосредственной адресации памяти программ выполнение программы продолжается с адреса, указанного в команде(рис.
26; FLASHEND – символическое имя адреса последней ячейкипамяти программ). Непосредственная адресация памяти программиспользуется в командах JMP и CALL.Команда31Память программ16158 7$0000КОПАдресАдрес1500АдресFLASHENDРис. 26. Непосредственная адресация памяти программ86При косвенной адресации памяти программ выполнениепрограммы продолжается с адреса, содержащегося в регистре Z,т.е.
в программный счетчик загружается содержимое регистра Z(рис. 27). Косвенная адресация памяти программ используется в командах IJMP и ICALL.КомандаПамять программ151508 70$0000КОП150АдресАдресРегистр ZFLASHENDРис. 27. Косвенная адресация памяти программПри относительной адресации памяти программ выполнениепрограммы продолжается с адреса (PC + k + 1), где PC – содержимоепрограммного счетчика; k – указанный в команде относительный адрес, который может принимать значения от –2048 до 2047 (рис. 28).Относительная адресация памяти программ используется в командахRJMP и RCALL.Память программКоманда15158 70КОПk1+0$0000PC+k+1Программныйсчётчик (РС)FLASHENDРис.
28. Относительная адресация памяти программ:k – относительный адресПри адресации константы адрес байта константы содержится врегистре Z (рис. 29): старшие 15 разрядов занимает адрес ячейки памяти программ (от 0 до 32 К); состояние младшего разряда (LSB) определяет выбор младшего(LSB = 0) или старшего (LSB = 1) байта ад87ресуемой ячейки памяти. Адресация константы в памяти программиспользуется в командах LPM (Load Program Memory), которая загружает адресованный регистром Z байт в указанный в команде регистр.
Если регистр-приемник не указан (команда используется безоперандов), байт загружается в регистр R0. Команда ELPM (ExtendedLoad Program Memory) служит для загрузки константы из памятипрограмм объемом более 64 К слов. При этом для расширения регистра-указателя Z используется регистр RAMPZ, связанный с регистром Z.Команда15Память программ08 7150$0000КОП151Адрес0АдресLSBLSB = 1Регистр ZLSB = 0FLASHENDРис. 29.