Например TDA7294

Форум РадиоКот • Просмотр темы - AVR ASM RAM
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн июл 28, 2025 01:56:21

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 14 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: AVR ASM RAM
СообщениеДобавлено: Чт июл 05, 2012 22:52:23 
Потрогал лапой паяльник
Аватар пользователя

Карма: 10
Рейтинг сообщений: 29
Зарегистрирован: Сб апр 28, 2012 16:04:14
Сообщений: 394
Рейтинг сообщения: 0
Как можно прочитать и записать 'nm' элемент массива 'array' ?
num - номер элемента
Код:
.dseg
  array  :  .byte 80
  nm     :  .byte 1

_________________
Критикуешь - предлагай. Предлагаешь - делай. Делаешь - отвечай.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Чт июл 05, 2012 23:42:59 
Друг Кота
Аватар пользователя

Карма: 75
Рейтинг сообщений: 611
Зарегистрирован: Ср дек 24, 2008 09:58:58
Сообщений: 3733
Рейтинг сообщения: 0
Медали: 3
Мявтор 1-й степени (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
Код:
ldi      XL, LOW(array)      ; заргузить адрес array в Х поинтер
ldi      XH, HIGH(array)      
lds      R16, num            ; загрузить индех в R16
add      XL, R16            ; вычислить адрес элемента в RAM
clr      R16
adc      XH, R16            ; Х = адрес

ld      R16, X            ; чтение элемента array в R16
st      X, R16            ; запись R16 в массив


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Пт июл 06, 2012 06:23:54 
Вымогатель припоя
Аватар пользователя

Карма: 5
Рейтинг сообщений: 74
Зарегистрирован: Пн июн 18, 2012 12:01:04
Сообщений: 650
Откуда: Челябинская область, Копейск
Рейтинг сообщения: 0
Вот такой способ еще есть, но num не должно быть больше 63 ($3f)

Код:
ldi      YL, low(array)           ; заргузить адрес array в Y
ldi      YH, high(array)      

ldd      r16, Y+num               ; чтение из num
std      Y+num, r16               ; сохранение в num


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Сб июл 07, 2012 09:36:47 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 1247
Зарегистрирован: Вс мар 29, 2009 22:09:05
Сообщений: 7517
Рейтинг сообщения: 0
Цитата:
Вот такой способ еще есть


Хм. А прокатит? По-моему, такие конструкции

ldd r16, Y+num

вычисляются препроцессором.

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Сб июл 07, 2012 17:20:15 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
Ser60 писал(а):
Код:
ldi      XL, LOW(array)      ; заргузить адрес array в Х поинтер
ldi      XH, HIGH(array)      
lds      R16, num            ; загрузить индех в R16
add      XL, R16            ; вычислить адрес элемента в RAM
clr      R16
adc      XH, R16            ; Х = адрес
Если поискать по форуму, то несколько раз найдётся

viewtopic.php?p=726327#p726327
viewtopic.php?p=904128#p904128

Код:
lds     XL, num                ; загрузить индех в XL
clr     XH                     ; Подготовить XH к вычислениям
subi    XL, LOW( -array )      ; Вычесть минус_число это всё равно что прибавить плюс_число, младшая школа
sbci    XH, HIGH( -array )     ; Х = адрес


Меньше кода, меньше регистров занято.
Я сейчас опять скажу обидное, но любой вменяемый С-компилятор делает такой компактный код. Какой смысл на асме писать хуже?

_____
А вообще-то это так, ping. «Пользуясь случаем» Чтобы старина Джек не беспокоился :-)

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Сб июл 07, 2012 17:21:38 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
YS писал(а):
Хм. А прокатит? По-моему, такие конструкции
ldd r16, Y+num
вычисляются препроцессором.
Ну да. Не покатит.
Точнее, num должно быть константой, вычисляемой ассемблером на этапе компиляции.

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Сб июл 07, 2012 22:29:42 
Держит паяльник хвостом
Аватар пользователя

Карма: 15
Рейтинг сообщений: 70
Зарегистрирован: Ср мар 28, 2012 21:45:24
Сообщений: 906
Откуда: ВО
Рейтинг сообщения: 0
Так по условию задачки он и есть константа. А вот код для задачки до конца так никто и не написал. :cry:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Вс июл 08, 2012 01:17:42 
Первый раз сказал Мяу!

Зарегистрирован: Ср апр 13, 2011 17:23:12
Сообщений: 29
Рейтинг сообщения: 0
ILYAUL писал(а):
Так по условию задачки он и есть константа.

Если num константа, то решение - всего одна команда lds :))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Ср июл 11, 2012 12:51:03 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15108
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
sx386 писал(а):
Как можно прочитать и записать 'nm' элемент массива 'array' ?
num - номер элемента
Код:
.dseg
  array  :  .byte 80
  nm     :  .byte 1

для начала - nm в вышеприведенном не является элементом массива array :tea:
этот элемент объявлен как самостоятельная метка в ОЗУ - по сему запись и /или чтение из него возможно любым доступным способом, вполоть до:
lds Rn, nm
sts nm,Rn ; где Rn любой из регистров (R0-R31)
если же надо считать элемент массива array (0-80), то его надо объявлять как константу или лучше использовать содержимое указателя позиции (num), размешенного по адресу, находящемуся в ячейке nm - но так "мудрить" стоит только при нехватки оперативных регистров
иначе удобнее было бы объявить :
.undef XL ; только у avrasm2 !!!
.undef XH ; только у avrasm2 !!!
.def nm_arreyl=R26
.def nm_arreyh=R27
.def tmp=r17
.def nm=R16 ; R0-R15 только в случае, если не предусматривается непосредственная загрузка данных в регистр иначе доступно лишь R16-R31
.def adr_arreyl=r3
.def adr_arreyh=r4
.dseg
array : .byte 80
ну и при инициализации записать какое-то начальное значение в nm и записать базовый адрес начала массива в какую-нибудь регистровую пару (а не напрямую в индексные регистры!)
затем чтение/запись по предварительно модифицированному индексному регистру ( но ни базовый адрес ни содержимое указателя при этом изменяться не должны)
можно конечно и другой вариант присобачить - нечто с базовым адресом в виде константы ( экономия двух регистров ) - но диапазон смещения маловат будет, посему с двумя дополнительными регистрами интереснее (да и число элементов массива может быть двухбайтовым...):
clr nm ; на этапе инициализации
ldi tmp,low(arrey)
mov adr_arreyl,tmp
ldi tmp,high(arrey)
mov adr_arreyh,tmp

----------
mov nm_arreyl,nm
clr nm_arreyh
add nm_arreyl, adr_arreyl
adc nm_arreyh,adr_arreyh ; создать текущий адрес элемента массива
ну и дальше - читай или записывай (ld Rd,X /st X,Rd) ... только вот куда? (надо бы какой -то регистр назначения иметь /Rd/)
:beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Ср июл 11, 2012 22:31:04 
Держит паяльник хвостом
Аватар пользователя

Карма: 15
Рейтинг сообщений: 70
Зарегистрирован: Ср мар 28, 2012 21:45:24
Сообщений: 906
Откуда: ВО
Рейтинг сообщения: 0
Цитата:
этот элемент объявлен как самостоятельная метка в ОЗУ - по сему запись и /или чтение из него возможно любым доступным способом, вполоть до:
lds Rn, nm
sts nm,Rn ; где Rn любой из регистров (R0-R31)
а
Ошибочка , вышла :))) . Чем отличается nm от array - да собственно ничем. И тот и другой МАССИВ данных , только один содержит 80 байт , а второй всего лишь один. И оба имеют 16 битный адрес в области RAM/ Так как к ним можно и нужно обращаться?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Чт июл 12, 2012 06:44:16 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15108
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
верно и то и другое - это ячейки в области ОЗУ
но под "массивом" подразумевается группа данных, размещенных в определенном порядке значения которых привязаны определенной зависимиостью к своему адресу...
обычно эти данные считываются/записываются выборочно
можно и напрямую (по абсмолютному адресу) - но тогда каждой ячейке свое имя задавать нужно...
причина - при задании вида (num - смещение относительно начала массива arrey)
ldi xl,low(arrey+num)
ldi xh,high(arrey+num)
или
lds Rn,arrey+num / sts arrey+num,Rn
получаем значения адреса ячейки, которые действительны исключительно на момент компиляции программного кода, а нужно чтоб этот адрес вычислялся программой в МК во время работы устройства то-ли в зависимости от внешних воздействий, то-ли в зависимости от результатов каких-либо вычислений 8)
несколько привычнее выглядят типовые таблички перекодировки для семисегментных индикаторов - тот же массив, но в ПЗУ и, в большинстве случаев, только для чтения (при записи ПЗУ свои особенности)
:beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Чт июл 12, 2012 10:36:06 
Держит паяльник хвостом
Аватар пользователя

Карма: 15
Рейтинг сообщений: 70
Зарегистрирован: Ср мар 28, 2012 21:45:24
Сообщений: 906
Откуда: ВО
Рейтинг сообщения: 0
Я говорил немножко не об этом .
Из условия задачи , нужно забрать данные из ячейки массива array и поместить их в ячейку памяти в nm. Доступ к nm возможен только через индексные регистры X,Y,Z. А как это сделать - уже просто выбор программиста.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Пт июл 13, 2012 06:17:30 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15108
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
как раз к nm доступ возможен любым способом - ее адрес фиксирован и вроде изменениям по ходу выполнения программы не подлежит...
поэтому допустимо обращение как через индексные регистры, так и прямая адресация и/или с помощью указателя стека (push/pop)
только обмен через стек требует повышенного внимания к подпрограммам и прерываниям 8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR ASM RAM
СообщениеДобавлено: Пт июл 13, 2012 06:50:37 
Держит паяльник хвостом
Аватар пользователя

Карма: 15
Рейтинг сообщений: 70
Зарегистрирован: Ср мар 28, 2012 21:45:24
Сообщений: 906
Откуда: ВО
Рейтинг сообщения: 0
Вообще-то адрес ячейки nm не столь важен и при обращении к ней можно его "забыть".


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y