|
|
  |
Работа с опреативной памятью в AVR ASM |
|
|
|
Jan 22 2011, 06:06
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(HoboTech @ Jan 21 2011, 15:19)  И все таки туго что-то до меня доходит работа с адресами... что означает следующий код: Код .DSEG tmp: .byte 1
...
lds ZL,tmp что я заношу в регистр ZL значение байта, который находился в памяти по адресу tmp или что я записываю значение младшего байта самого адреса?  В регистр ZL загружается содержимое ячейки памяти с адресом tmp. Если вы хотите загрузить в ZL адрес ячейки, используйте команду LDI. Все ваши проблемы возникают от того, что вы путаете различные методы адресации. В ассемблере AVR различные методы адресации определяются с помощью различных мнемоник. Код ldi r16, 5 ; Непосредственная (immediate) адресация - загрузка числа 5 lds r16, 5 ; Прямая (direct) адресация - загрузка в регистр r16 содержимого ячейки по адресу 5 ld r16, Z ; Косвенная (indirect) адресация - загрузка в регистр r16 через указатель Z ld r16, Z+ ; Автоинкрементная (post increment) адресация через указатель Z ld r16, Z- ; Автодекрементная (pre decrement) адресация через указатель Z ldd r16, z+5 ; Косвенная со смещением (inditect with displscement) адресация через указатель Z ; адрес ячейки памяти определяется как сумма содержимого указателя Z и числа 5 Надеюсь, что немного прояснил ситуацию. Или нет?
Сообщение отредактировал _Bill - Jan 22 2011, 06:07
|
|
|
|
|
Jan 24 2011, 08:42
|

Участник

Группа: Участник
Сообщений: 17
Регистрация: 27-09-10
Из: Харьков
Пользователь №: 59 762

|
Про lds и ldi я понял, спасибо. Не понял что именно загружается (значение или адрес) в этих строках: Цитата(_Bill @ Jan 22 2011, 08:06)  ld r16, Z ; Косвенная (indirect) адресация - загрузка в регистр r16 через указатель Z ld r16, Z+ ; Автоинкрементная (post increment) адресация через указатель Z ld r16, Z- ; Автодекрементная (pre decrement) адресация через указатель Z ldd r16, z+5 ; Косвенная со смещением (inditect with displscement) адресация через указатель Z ; адрес ячейки памяти определяется как сумма содержимого указателя Z и числа 5[/code] P.S. Мануалы честно читал, но когда дошло до практической реализации - запнулся.
Сообщение отредактировал HoboTech - Jan 24 2011, 08:44
|
|
|
|
|
Jan 24 2011, 09:57
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(HoboTech @ Jan 24 2011, 11:42)  Не понял что именно загружается (значение или адрес) в этих строках: Для AVR в строках где нет никаких цифирей происходит косвенное обращение к данным (чтение или запись). Адрес сидит внутри регистровой пары и его в коде операции не видно - поэтому такой тип адресации и называется косвенным (через индексные регистры X,Y,Z). Смею предположить, что без такого способа адресации программирования, как мы его сегодня знаем, не существовало. Так что изучите это очень внимательно! Основа основ как-никак:-)
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jan 24 2011, 12:35
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(HoboTech @ Jan 24 2011, 12:42)  Про lds и ldi я понял, спасибо. Не понял что именно загружается (значение или адрес) в этих строках:
P.S. Мануалы честно читал, но когда дошло до практической реализации - запнулся. Методы адресации - это один из трех китов, на которых держится архитектура любого процессора (AVR в том числе). Так что стоит затратить время, чтобы разобраться с адресацией. В дальнейшем эти знания скорее всего вам понадобятся. Что касается семейства AVR, то советую внимательнее почитать сей документ Система команд AVR
|
|
|
|
|
Jan 26 2011, 00:54
|
Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 20-11-10
Пользователь №: 61 032

|
Не считая полезным занятием переписывание собственными словами документа "AVR Instruction Set", обратил бы внимание на: Код ldi XH, high(addr) ldi XL, low(addr) cli ; !!! ld R16, X+ ld R17, X sei ; !!! В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания. Где-то умнее излагается о, но ссылку либо название затрудняюсь.
|
|
|
|
|
Jan 26 2011, 04:02
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(нечитатель @ Jan 26 2011, 04:54)  Не считая полезным занятием переписывание собственными словами документа "AVR Instruction Set", обратил бы внимание на: Код ldi XH, high(addr) ldi XL, low(addr) cli ; !!! ld R16, X+ ld R17, X sei ; !!! В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания. Где-то умнее излагается о, но ссылку либо название затрудняюсь. Это как?!
|
|
|
|
|
Jan 26 2011, 05:04
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782

|
Цитата(нечитатель @ Jan 26 2011, 03:54)  В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.
Где-то умнее излагается о, но ссылку либо название затрудняюсь.  ну во-первых , после ld R16, X+ прерывание не может произойти , а во-вторых-что за диверсант будет портить регистр X ? upd.Аааааа - V_G понял откуда ноги растут...  Цитата... Доступ к 16-разрядным регистрам Регистры TCNTn, OCRnA/B/C и ICRn являются 16-разрядными, поэтому, доступ к ним через 8-разр. шину данных AVR ЦПУ может быть осуществлен с помощью двух инструкций чтения или записи. У каждого 16-разр. таймера имеется свой 8-разр. регистр для временного хранения старшего байта данных. Поэтому, во время доступа к 16-разр. регистрам одного таймера используется один и тот же временный регистр... ...Не все 16-разрядные регистры используют временный регистр для копирования старшего байта. Чтение 16-разр. регистров OCRnA/B/C не связано с использованием временного регистра... ...При этом следует обратить внимание на проблему, которая связана с необходимостью выполнения двух инструкций для получения доступа к 16-разр. регистру. Если после выполнения первой инструкции доступа 16-разр. регистра происходит прерывание и в процедуре обработки прерывания также происходит обновление этого же или другого регистра, но относящегося к тому же таймеру, то по завершении обработки прерывания изменяется содержимое временного регистра и выполнение второй инструкции приведет к некорректному результату. Таким образом, когда и в основной программе и в прерываниях происходит обновление временного регистра, то в основной программе перед инициацией доступа к 16-разр. регистру необходимо запретить прерывания... Конец Цитаты.
Сообщение отредактировал OlegNZH - Jan 26 2011, 05:44
|
|
|
|
|
Jan 26 2011, 05:46
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(OlegNZH @ Jan 26 2011, 09:04)   ну во-первых , после ld R16, X+ прерывание не может произойти , а во-вторых-что за диверсант будет портить регистр X ? upd.Аааааа - я понял откуда ноги растут... Ну, во-первых, прерывание может произойти когда угодно, но переход к прерыванию начинается только после выполнения текущей инструкции. Что касается доступа к 16-разрядным портам ВВ, то это совсем другая история.
Сообщение отредактировал _Bill - Jan 26 2011, 05:47
|
|
|
|
|
Jan 26 2011, 06:02
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782

|
Цитата(_Bill @ Jan 26 2011, 08:46)  Ну, во-первых, прерывание может произойти когда угодно, но переход к прерыванию начинается только после выполнения текущей инструкции. Что касается доступа к 16-разрядным портам ВВ, то это совсем другая история. Вообще-то я- про конкретную конструкцию говорил cli ; !!! ld R16, X+ А регистры XYZ к прерываниям никаким боком...Здесь речь может идти только о регистрах ВВ.
|
|
|
|
|
Jan 26 2011, 06:12
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(OlegNZH @ Jan 26 2011, 10:02)  Вообще-то я- про конкретную конструкцию говорил cli ; !!! ld R16, X+ На целостность выполнения инструкции ld R16, X+ запрет или разрешение прерываний никоим образом не повлияют. С таким же успехом можно использовать и такую конструкцию Код sei ; !!! ld R16, X+
Сообщение отредактировал _Bill - Jan 26 2011, 06:14
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|