Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15549
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение BOB51 »

Ну что же Вы такой вредный?
Допустим я сделал какое-то специфическое размещение данных в памяти, скомпилировал исходник и определил, что нужная мне ячейка имеет адрес 0x0120.
Но по каким-то причинам (схемотехнические хитрости - как та же внешняя память программ/данных или еще чего поизвратнее) поручить компилятору автоматическое вычисление этого адреса невозможно.
Вот тогда я и буду использовать
.EQU name = 0x0120
для доступа к той ячейке.
Довольно типовое решение к примеру в моей котуинке (биос + подгружаемые во внешнюю совмеенную память программ/данных целевых программ устройства)...
8)
Последний раз редактировалось BOB51 Чт янв 18, 2024 19:46:42, всего редактировалось 1 раз.
С.Н.
Потрогал лапой паяльник
Сообщения: 307
Зарегистрирован: Пн окт 26, 2020 08:37:51
Откуда: г.Волгоград

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение С.Н. »

Ух уж эти перепалки "Друзей Кота" про длину своих "хвостов". Почище Санта-Барбары.
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
linkov1959
Держит паяльник хвостом
Сообщения: 923
Зарегистрирован: Пн сен 10, 2018 19:16:28

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение linkov1959 »

Человеку присуща деликатность, критикуешь других, критикуй себя, фифти-фифти. Сначала признайся в собственной глупости, а потом других дураками называй! На каждого мудреца довольно простоты.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25154
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение КРАМ »

[uquote="BOB51",url="/forum/viewtopic.php?p=4532064#p4532064"]Ну что же Вы такой вредный?
Допустим я сделал какое-то специфическое размещение данных в памяти, скомпилировал исходник и определил, что нужная мне ячейка имеет адрес 0x0120.
8)[/uquote]
Для этого, внезапно, есть .org
Это специально созданный гвоздь для прибивания адреса.
И вы это знаете не хуже меня.
Кстати, корректное резервирование памяти позволяет любой АСМ код использовать вместе с Си.
В отличии от...
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Engineer_Keen »

Ну вод представьте, есть код:
Спойлер

Код: Выделить всё

	.equ	TX_BUFFER	=0x0100
	.equ	RX_BUFFER	=0x0120
	.equ	TX_PTR		=0x0122
	.equ	RX_PTR		=0x0124
	..........
	.equ	VAR123412151	=0x1234
или
Спойлер

Код: Выделить всё

	.equ	TX_BUFFER_SIZE	=32
	.equ	RX_BUFFER_SIZE	=32
	.equ	PTR		=2
	.dseg
TX_BUFFER:	.byte	TX_BUFFER_SIZE
RX_BUFFER:	.byte	RX_BUFFER_SIZE
TX_PTR:		.byte	PTR
RX_PTR:		.byte	PTR
.........
VAR123412151:	.byte	1
И тут я решил изменить размер буфера передачи, на один байт... По-моему нижний вариант просто удобнее.
Ну да, я не знаю какой по факту адрес у конкретной переменной, пока в .map или в .lst не посмотрю, но оно не часто и нужно.
ИМХО для каждой директивы свое применение.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
Gennadiy
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Чт июн 17, 2010 07:40:31
Откуда: Россия

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gennadiy »

Сдается мнение, что критикой занимаются пользователи Си.
Я полностью согласен со Старичком, т.к. мы с ним активные Ассемблерщики. А в Ассемблере контроль размера буфера переменных лежит исключительно на программисте, как и расположение их в памяти МК. Тем более при пошаговой отладке знать точное распределение памяти (RAM, EEPROM, Flash) крайне необходимо.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25154
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение КРАМ »

[uquote="Gennadiy",url="/forum/viewtopic.php?p=4533604#p4533604"]Сдается мнение, что критикой занимаются пользователи Си.[/uquote]
Мнение НЕ верное. Я занимаюсь критикой, но на Си из полусотни проектов для 8 бит (те, что в серийных изделиях - хоббийные не в счет) написан лишь один. Но поскольку я пишу и на Си (это проекты для АРМов), то у меня есть вполне определенный взгляд на написание кода вообще - независимо от языка.
[uquote="Gennadiy",url="/forum/viewtopic.php?p=4533604#p4533604"]А в Ассемблере контроль размера буфера переменных лежит исключительно на программисте, как и расположение их в памяти МК.[/uquote]
И как это противоречит использованию .byte? Вы очевидно не понимаете, что никакого "принудительного" размещения в ассемблере нет НИ ПРИ КАКИХ синтаксических оборотах. Просто принципиально нет.
[uquote="Gennadiy",url="/forum/viewtopic.php?p=4533604#p4533604"]Тем более при пошаговой отладке знать точное распределение памяти (RAM, EEPROM, Flash) крайне необходимо.[/uquote]
И что? Именно директива .byte позволяет получить ВИДИМОСТЬ переменных ПО ИМЕНИ. А адрес и так всегда указан рядом с именем.
Такшта вы просто пытаетесь критиковать "вкус устриц", ни разу их не пробуя... И это действительно факт. Железобетонный.

Добавлено after 6 minutes 40 seconds:
[uquote="Engineer_Keen",url="/forum/viewtopic.php?p=4533597#p4533597"]Ну да, я не знаю какой по факту адрес у конкретной переменной, пока в .map или в .lst не посмотрю, но оно не часто и нужно.[/uquote]
С чего бы вы не знаете? И смотреть в map или lst нет никакой необходимости.
В окне Watch адрес рядом с именем обозначен. В тексте кода имя переменной является ее адресом, поэтому и тут нет необходимости обращаться к численному значению.
Ну и достаточно просто обозначить через org начало списка byte.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Engineer_Keen »

Gennadiy, а зачем контролировать размещение в памяти переменных, вручную задавая адреса, если среда разработки (в данном случае AVR студия) сама позволяет их расставлять? Я же привел выше пример. Что вы будете делать, если в начале адресов переменных придется изменять их размер или количество? Все следующие адреса вручную пересчитывать и переписывать?
И это не только вопрос удобства. Я (да все, кто более менее большие программы пишет) весь код делю на модули, UART - отдельный asm-файл, SPI - отдельный файл, работа с каким-нибудь дисплеем - отдельный файл, так и к ним еще inc файлы. Например UART.inc с константами для определения/вычисления скорости, размерами буферов, кодами команд, и там же - выделяем области памяти в dseg. И не надо среди всего кода искать то что относится именно к UART. И эту пару модулей, можно в другом проекте использовать с минимальными переделками, не боясь что области памяти друг на друга налезут, т.к. все переменные на этапе компиляции сами в нужное место встанут, в зависимости от того, где .inc в тексте основной программы вписать!
А в случае использования для резервирования .equ? В одном модуле определил адрес массива в 200 байт, а в другом можно случайно одну переменную для какого-нибудь счетчика в середине этого массива определить, и здравствуйте глюки...
Ни кто не запрещает equ для переменных, ну например в целях той-же отладки какой-либо определенной переменной, ну или если нужна какая-либо хитрость, выравнивание, чтобы буфер или массив начинался с адреса хх00, но в 99% случаев этого не нужно.

КРАМ, я отладкой занимаюсь либо протеусе (пока железка не готова), либо в железке, так вот протеус со списком watch из студии подружить не получается, там приходится адреса вручную вбивать :dont_know:
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
Gennadiy
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Чт июн 17, 2010 07:40:31
Откуда: Россия

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gennadiy »

Можно взглянуть на пример использования (запись/чтение/модификация) переменной, созданной с помощью директивы .byte, в Ассме? И да, у меня тоже есть большие проекты критичные ко времени исполнения (real-time), содержащие до 10 массивов, 206 (на данный момент) переменных и флагов различной размерности. Я не представляю, как во всем этом можно было бы ориентироваться (при пошаговой отладке), не пригвоздив каждую к конкретному месту, полагаясь только на среду разработки.
Возможно Ваши примеры направят меня на путь истинный. Без подколов и шуток, покажите преимущество .byte, пожалуйста.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Engineer_Keen »

Чтение/запись/модификация будет выглядеть точно также, можете просто переписать весь код определения переменных с .equ на .byte а все что в .cseg - не трогать, оно скомпилируется без ошибок!
Что для .equ ИМЯ=АДРЕС, что для ИМЯ: .byte РАЗМЕР, и там и там компилятор генерирует пару ИМЯ-АДРЕС, только в первом случае адрес задает программист (а он может ошибаться), а во втором его вычисляет компилятор автоматически.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
Gennadiy
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Чт июн 17, 2010 07:40:31
Откуда: Россия

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gennadiy »

Значит, есть желание контролировать память - .equ, нет желания париться с этим вопросом (пусть компилятор сам решает) - .byte. Так? Спасибо.
Тогда в чем весь сыр-бор, устроенный тут? Ведь обработка переменной, длиной отличной от 8 бит, все-равно ляжет на плечи программиста.
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Just_Fluffy »

Gennadiy, Перечислите случаи, когда вам нужно было "прибивать" переменную гвоздями к конкретному месту в ОЗУ?
Вот когда переменная должна лежать только в этом месте и ни в каком другом?
equ именно это и делает. Но тогда распределение переменных в ОЗУ становится вашей головной болью.
Переносимость кода резко падает. Поскольку в других проектах нужно заново пересчитывать расположение переменных в ОЗУ.
И зачем?
Есть правильный инструмент, поддерживаемый компиляторами и отладчиками. но нужно придумывать что то свое.
Директива equ говорит компилятору, где должна быть переменная.
А директива byte - сколько занимает ваша переменная.
И к той и к другой можно обращаться одинаково - по имени.
Но в случае изменений в проекте, когда надо буферу размерчик добавить, или ввести новую переменную - придется руками пересчитать все equ, которые лежат после новой переменной или обновленного буфера.
В случае byte - компилятор сам подвинет все прозрачно для программы.... И в 99.8% случаев это никак не повлияет на программу.
Остаются редкие случаи, когда на область ОЗУ проецируется какая то периферия или внешнее ОЗУ - там да, нужно явно указать, откуда оно начинается.
Или когда буфер должен начинаться с какого то кратного адреса, что б указатель легче обсчитывать ... Но это блин , настолько редкие случаи....
Откройте любой учебник по асму, прочтите, как резервировать ОЗУ - и радуйтесь жизни :)
Белая и Пушистая
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25154
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение КРАМ »

[uquote="Gennadiy",url="/forum/viewtopic.php?p=4533731#p4533731"]Значит, есть желание контролировать память - .equ, нет желания париться с этим вопросом (пусть компилятор сам решает) - .byte. Так? .[/uquote]
Поток сознания.
Компилятор ничего не решает. После привязки через org адреса идут по списку строго последовательно.
Так что по сути программирования никакой разницы нет.
Если не считать того, о чем я сказал ранее.
Аватара пользователя
Gennadiy
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Чт июн 17, 2010 07:40:31
Откуда: Россия

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gennadiy »

Согласен с Вами, по сути программирования никакой разницы нет. В итоге имеем имя к которому обращаемся в программе. Почему прибиваю? Да потому что в отладчике мне удобнее ориентироваться в данных, которые именно я разложил "по полочкам", а не компилятор.
По Вашим словам "Именно директива .byte позволяет получить ВИДИМОСТЬ переменных ПО ИМЕНИ. А адрес и так всегда указан рядом с именем." Вопрос. Директива .equ
не позволяет сделать то же самое, заменяя имя переменной ее адресом, указанным в листинге? Немного возни с порядком, зато полный контроль за процессом.
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Just_Fluffy »

Gennadiy, в нормальном отладчике как раз наоборот. Переменные через .byte видны как переменные и их не нужно искать в простыне содержимого памяти. Ну да дело ваше. Кому и *** невеста.
Белая и Пушистая
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Starichok51
Модератор
Сообщения: 19044
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Starichok51 »

что нашел на последних страницах перенес в новую тему "Вопросы по отладке".
более ранний базар про отладку выискивать не стал.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3474
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение smacorp »

Если боитесь замучиться, зачем лезть в ассемблер?
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Аватара пользователя
PicNov76
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб дек 01, 2007 12:24:20

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение PicNov76 »

Микроконтроллер at90s2313 не имеет команды LPM Rd, Z+
Вопрос чем заменить. Подскажите.
Ну что, ремонтировать будем или пусть работает?
Игорь_396
Встал на лапы
Сообщения: 102
Зарегистрирован: Ср дек 25, 2019 21:17:31
Откуда: Саратов

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Игорь_396 »

[uquote="PicNov76",url="/forum/viewtopic.php?p=4589450#p4589450"]Микроконтроллер at90s2313 не имеет команды LPM Rd, Z+
Вопрос чем заменить. Подскажите.[/uquote]
У меня симулятор такую конструкцию проглотил:
lpm ;
//mov (куда надо), R0 ;
ld r16, z+ ; в любой свободный регистр
Без проблем читает с конца флеша.
Как в реальном мк будет - хз, нет такого в наличии..
Ответить

Вернуться в «AVR»