AVR Assembler

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт июл 14, 2023 19:07:53

Сообщение Иван Михайлович »

Всем привет!
Я один из тех динозавров, что пишут код под AVR на ассме)
Есть код массива во флеш:

Array:
.db "Kakoi-to text "

Про чётное количество элементов в массиве мне известно. Есть ли какой-то оператор или действие по вычислению и присвоению константе количества элементов в массиве компилятором?
Компилятор tavrasm.

Добавлено after 1 hour 1 minute 49 seconds:
Разобрался!) Если кому-то интересно, то вот:

Array:
.db "Kakoi-to text "

.equ Const_Byte=(PC-Array)*2
.equ Const_Word=PC-Array
Окстись! Открой DataSheet и просветись!
Реклама
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Array это адрес, а не размер массива. Отсюда, непонятно, что вы получили этим "PC-Array"....
Контактная информация:
Реклама
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

[uquote="Martian",url="/forum/viewtopic.php?p=4448269#p4448269"]да и с четным количеством элементов странно...[/uquote]
Ничего странного. Адресация пословная. Отсюда, когда создаёшь константы директивой .db количество байтов должно быть четным. Компилятор предупреждает об этом, если нечётное. Поэтому, когда у тебя в массиве нечётное кол-во байтов, нужно дополнить до четного.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт июл 14, 2023 19:07:53

Сообщение Иван Михайлович »

[uquote="Demiurg",url="/forum/viewtopic.php?p=4448266#p4448266"]Array это адрес, а не размер массива. Отсюда, непонятно, что вы получили этим "PC-Array"....[/uquote]

Естественно, Array - это адрес массива. PC - это счётчик команд. Вычитая из последнего значения счётчика начальный адрес (PC-Array), мы получаем размер массива в словах, который присваиваем константе Const_Word (Const_Word*2 - в байтах, соответственно).
Что тут не понятного?)

Добавлено after 6 minutes 42 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4448290#p4448290"]Байты не есть элементы. Элементов в массиве может быть сколько угодно. То, что их хранение обусловлено какими-то архитектурными особенностями не имеет к их количеству отношения (за исключением максимального размера)[/uquote]

Такова архитектура AVR, увы, ничего с этим не поделаешь. Количество байт должно быть обязательно чётным и в одну строку, в случае ассемблерного кода! Если Вы пишите на сях массив с нечётным количеством элементов, то компилятор сам за Вас добавит этот чётный байт.
Окстись! Открой DataSheet и просветись!
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт июл 14, 2023 19:07:53

Сообщение Иван Михайлович »

[uquote="Martian",url="/forum/viewtopic.php?p=4448337#p4448337"]ок. у меня массив из трех элементов, размер каждого элемента два байта. Теперь понятно? А если я пишу на "сях", как Вы умудрились выразиться, то компилятор поведет себя так, как я его настрою.[/uquote]

Не надо путать тёплое с мягким. Речь шла про побайтовую запись, а не про пословную.
Окстись! Открой DataSheet и просветись!
Реклама
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт июл 14, 2023 19:07:53

Сообщение Иван Михайлович »

[uquote="Martian",url="/forum/viewtopic.php?p=4448342#p4448342"]Ужас. Это Вы путаете теплое с мягким, считая "элемент массива" и "байт" синонимами.

Добавлено after 54 seconds:
[uquote="Иван Михайлович",url="/forum/viewtopic.php?p=4446321#p4446321"]Про чётное количество элементов в массиве мне известно.[/uquote][/uquote]
:facepalm:
В данном примере один элемент массива равен одному байту. Что я путаю?
Окстись! Открой DataSheet и просветись!
Реклама
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт июл 14, 2023 19:07:53

Сообщение Иван Михайлович »

[uquote="Martian",url="/forum/viewtopic.php?p=4448358#p4448358"]Всё.[/uquote]

"Ой" перед "Всё." забыли добавить :))

Дядь, Вы по ходу дупля не отбиваете, что такое директивы ассемблера и как устроена память программ AVR ядра, да ещё пытаетесь дать какой-то "умный" совет :))

Читайте, просвещайтесь:

https://radiokot.ru/start/mcu_fpga/avr/12/

https://el-shema.ru/publ/kontroller/mik ... i/9-1-0-68

https://cxem.net/mc/book21.php
Окстись! Открой DataSheet и просветись!
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт июл 14, 2023 19:07:53

Сообщение Иван Михайлович »

[uquote="Martian",url="/forum/viewtopic.php?p=4448376#p4448376"]Элемент массива относится к байту так же, как ящик к килограмму. Но 14-летнему этого не понять, похоже, зато хамить уже научился.[/uquote]

Вы можете и дальше продолжать свои сравнения в виду отсутствия элементарных знаний, я умываю руки :)

Свои нелепые оценочные суждения оставьте себе и своим близким.
Окстись! Открой DataSheet и просветись!
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

похоже вы и сами не отчетливо представляете о чем речь, поэтому не смогли просто и понятно пояснить человеку.
вопрос не имеет отношение ни размерности элементов массива ни к четности кол-ва его байт.
При многострочном применением инструкции .db (при нарезке одного массива для удобства восприятия) - именно в этом случае недопустимо в строке нечетное кол-во байт, кроме последней строки.
причина в 16-битной адресации, при трансляции инструкций .db ... в код - массив не будет слитно склеиваться на стыках невыровненных (к адресации) байт.

это из ваших же ссылок.

П.С. некорректно выразился "16-битной адресации", но надеюсь понятно один шаг счетчика команд - два байта.
Последний раз редактировалось a797945 Вт июл 18, 2023 21:00:23, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 5947
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж

Сообщение >TEHb< »

По такой логике и первый элемент должен размещаться по чётному адресу. Есть какой-нибудь аналог СИшного allign или оно само собой выравниватся?
Усложнять просто. Упрощать сложно.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт июл 14, 2023 19:07:53

Сообщение Иван Михайлович »

[uquote="a797945",url="/forum/viewtopic.php?p=4448414#p4448414"]похоже вы и сами не отчетливо представляете о чем речь, поэтому не смогли просто и понятно пояснить человеку.
вопрос не имеет отношение ни размерности элементов массива ни к четности кол-ва его байт.
При многострочном применением инструкции .db (при нарезке одного массива для удобства восприятия) - именно в этом случае недопустимо в строке нечетное кол-во байт, кроме последней строки.
причина в 16-битной адресации, при трансляции инструкций .db ... в код - массив не будет слитно склеиваться на стыках невыровненных (к адресации) байт.

это из ваших же ссылок.[/uquote]

Об этом писал ещё Demiurg в третьем ответе.
Я привёл пачку ссылок, где можно было это всё прочесть. Объяснять всем тем, кто на бронепоезде - жизни не хватит :))
Окстись! Открой DataSheet и просветись!
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Понаехали тут понаехи из си. Лезете в тему, так хоть разберитесь в вопросе. Куда вы суетесь, вумники, йоптыть.
Ассемблер.
Директива .db. Побайтовая запись. В этом случае нужно смотреть за четным количеством элементов массива.
Пример.
.db 0x02, 0xFF
.db "Vasya Petya", 0x00

Директива .dw. Пословная запись. В этом случае не нужно смотреть за четным количеством байтов.

Что непонятно, господа понаехи?

ТС. Повторяю. Array это адрес. PC это счётчик команд. Текущая строка. Чревато ошибкой. Я сразу понял про что вы. Но, это ненадежный способ. Но не понял ваших мотивов использовать такой костыльный способ.
Контактная информация:
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Martian, Покажите мне свой проект на ассемблере. Не нужно кидаться словами "вы ничего не знаете". Я повторяю. В данный момент тема ассемблера. Это не си. И любой константный массив, это массив. И любой элемент массива, что побайтная запись, что пословная, это элемент массива.
Либо вы слышите собеседника, либо валите хвастаться своим ай Кью в другом месте.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15816
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

У топикстартера
tavrasm,
а большинство местных мастеров ассемблера работают под AVRASM2
(АВР студио 4.19 или более поздняя 7/микрочип студия).
Оттого возможны весьма существенные разночтения - не изучать же детально описание tavrasm для разовой консультации...
8)
относительно GAS GCC это вообще "отдельно садомазохистская тема"
:tea:
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт июл 14, 2023 19:07:53

Сообщение Иван Михайлович »

[uquote="Demiurg",url="/forum/viewtopic.php?p=4448506#p4448506"]ТС. Повторяю. Array это адрес. PC это счётчик команд. Текущая строка. Чревато ошибкой. Я сразу понял про что вы. Но, это ненадежный способ. Но не понял ваших мотивов использовать такой костыльный способ.[/uquote]

У меня есть небольшой проект выходного дня, некий отладчик по USART. Практического смысла, возможно, не имеет, но мне просто интересно. Задумок по нему очень много, реализовано пока далеко не всё. Не буду вдаваться в подробности парсига, после обработки принятых по USART данных есть номер элемента в массиве адресов, после чтения которого выполняется косвенный переход.
Адресов в массиве в виде:
Table_Vectors_Registers_Array:

.dw R0_Array
.dw R1_Array
.dw R2_Array
.dw R3_Array
.dw R4_Array
.dw R5_Array
.dw R6_Array
...................
больше сотни. Считать их вручную - сдохнуть можно.
.equ Count_Register_Const = PC-Table_Vectors_Registers_Array - решает эту проблему. Данная константа нужна для парсинга данных. Этот способ придумал не я, подсмотрел на каком-то забугорном форуме, концов уже не найти.
Если у Вас есть способ, как это можно сделать по другому, поделитесь, пожалуйста, возьму на вооружение :kill:

Вот несколько скриншотов, что умеет делать моя сырая прога, но это не весь реализованный функционал на данный момент)
Вложения
Reg_State_2.png
Проверка состояния любого регистра
(32.39 КБ) 60 скачиваний
Reg_State.png
Состояние РОН
(53.12 КБ) 57 скачиваний
EEPROM_State.png
Состояние EEPROM
(39.22 КБ) 53 скачивания
Ram_State.png
Состояние RAM
(40.85 КБ) 64 скачивания
Последний раз редактировалось Иван Михайлович Ср июл 19, 2023 12:22:05, всего редактировалось 1 раз.
Окстись! Открой DataSheet и просветись!
Друг Кота
Аватара пользователя
Сообщения: 15816
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Всего-то обмен с терминалкой в ПК?
8)
Я чуток получше, но на MCS51, делал (включая командный режим)...
https://radiokot.ru/forum/viewtopic.php?f=62&t=156720
На АВРках или МК с достаточным ОЗУ или меги с внешним ОЗУ-накопителем аналогом могут быть.
Смысл построчно каждый байт DW прописывать-то(вместо одной строки)?
Это ведь простая таблица векторов размером в слово (а не побайтовые таблицы смещения/скоростных перекодировщиков).
:roll:
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт июл 14, 2023 19:07:53

Сообщение Иван Михайлович »

[uquote="BOB51",url="/forum/viewtopic.php?p=4448725#p4448725"]Смысл построчно каждый байт DW прописывать-то(вместо одной строки)?
Это ведь простая таблица векторов размером в слово (а не побайтовые таблицы смещения/скоростных перекодировщиков).
:roll:[/uquote]
Командный режим тоже есть)
Для удобства восприятия информации) памяти в обоих случаях расходуется одинаково)
Окстись! Открой DataSheet и просветись!
Друг Кота
Аватара пользователя
Сообщения: 15816
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

А не проще "база + смещение" (Z+N и IJMP/ICALL)?
При вычисляемом (принимаемом) смещении (или готовом 2-байтовым адресом в теле команды)?
8)
Да и целая тема по АВР ассемблеру уже есть:
https://radiokot.ru/forum/viewtopic.php?f=57&t=5931
:wink:
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт июл 14, 2023 19:07:53

Сообщение Иван Михайлович »

Именно так и реализованно.
Чтение 2 байт "адрес массива+номер адреса необходимой подпрограммы" и icall)
Окстись! Открой DataSheet и просветись!
Друг Кота
Аватара пользователя
Сообщения: 15816
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Но в таком случае размер массива векторов не требуется.
Достаточно указания имен точек входа...
8)
Ответить

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