Перейти к содержанию
    

Работа с опреативной памятью в AVR ASM

И все таки туго что-то до меня доходит работа с адресами...

что означает следующий код:

.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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про lds и ldi я понял, спасибо. Не понял что именно загружается (значение или адрес) в этих строках:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.S. Мануалы честно читал, но когда дошло до практической реализации - запнулся.

Вы считаете это чем-то из ряда вон, что при освоении нового материала надо приложить некоторые усилия?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понял что именно загружается (значение или адрес) в этих строках:

Для AVR в строках где нет никаких цифирей происходит косвенное обращение к данным (чтение или запись).

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

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

Так что изучите это очень внимательно! Основа основ как-никак:-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В регистр ZL загружается содержимое ячейки памяти с адресом tmp. Если вы хотите загрузить в ZL адрес ячейки, используйте команду LDI. Все ваши проблемы возникают от того, что вы путаете различные методы адресации. В ассемблере AVR различные методы адресации определяются с помощью различных мнемоник.

        ld    r16, Z-    ; Автодекрементная (pre decrement) адресация через указатель Z
Просто правка  LD R16 ,-Z

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про lds и ldi я понял, спасибо. Не понял что именно загружается (значение или адрес) в этих строках:

 

 

P.S. Мануалы честно читал, но когда дошло до практической реализации - запнулся.

Методы адресации - это один из трех китов, на которых держится архитектура любого процессора (AVR в том числе). Так что стоит затратить время, чтобы разобраться с адресацией. В дальнейшем эти знания скорее всего вам понадобятся. Что касается семейства AVR, то советую внимательнее почитать сей документ Система команд AVR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно , так же открыть Ефремова . Почитать главу "Способы адресации памяти данных"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы. Еще почитаю, наверняка возникнут вопросы, задам их тут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не считая полезным занятием переписывание собственными словами документа "AVR Instruction Set", обратил бы внимание на:

ldi XH, high(addr)
ldi XL, low(addr)
cli                                  ; !!!
ld R16, X+
ld R17, X
sei                                  ; !!!

В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

 

Где-то умнее излагается о, но ссылку либо название затрудняюсь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не считая полезным занятием переписывание собственными словами документа "AVR Instruction Set", обратил бы внимание на:

ldi XH, high(addr)
ldi XL, low(addr)
cli                                 ; !!!
ld R16, X+
ld R17, X
sei                                 ; !!!

В том смысле, что если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

 

Где-то умнее излагается о, но ссылку либо название затрудняюсь.

Это как?! :05:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если после ld R16, X+ произойдёт прерывание - после возврата из него XH и (или?) XL испортятся. Даже если попытано их сохранять/восстановлять в процедуре обработки прерывания.

 

Где-то умнее излагается о, но ссылку либо название затрудняюсь.

Если бы так было, это следовало бы писать красными большими буквами 32 кегля во всех документах, а Атмел давно бы заклевали конкуренты. Так что ссылку в студию, начнем клевать...

 

Может, вы спутали с загрузкой 2-байтных регистров с использованием внутренних защелок и жесткими требованиями к таймингам? Это есть, и во всех pdf-ках есть отдельный параграф про работу с 16-разрядными регистрами.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В том смысле, что если после 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:) ну во-первых , после ld R16, X+ прерывание не может произойти , а во-вторых-что за диверсант будет портить регистр X ?

 

upd.Аааааа - я понял откуда ноги растут...

Ну, во-первых, прерывание может произойти когда угодно, но переход к прерыванию начинается только после выполнения текущей инструкции. Что касается доступа к 16-разрядным портам ВВ, то это совсем другая история.

Изменено пользователем _Bill

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, во-первых, прерывание может произойти когда угодно, но переход к прерыванию начинается только после выполнения текущей инструкции. Что касается доступа к 16-разрядным портам ВВ, то это совсем другая история.

Вообще-то я- про конкретную конструкцию говорил

cli ; !!!

ld R16, X+

А регистры XYZ к прерываниям никаким боком...Здесь речь может идти только о регистрах ВВ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то я- про конкретную конструкцию говорил

cli ; !!!

ld R16, X+

На целостность выполнения инструкции ld R16, X+ запрет или разрешение прерываний никоим образом не повлияют. С таким же успехом можно использовать и такую конструкцию

     sei                            ; !!!
     ld     R16, X+

Изменено пользователем _Bill

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...