Всем привет! Я один из тех динозавров, что пишут код под AVR на ассме) Есть код массива во флеш:
Array: .db "Kakoi-to text "
Про чётное количество элементов в массиве мне известно. Есть ли какой-то оператор или действие по вычислению и присвоению константе количества элементов в массиве компилятором? Компилятор tavrasm.
Добавлено after 1 hour 1 minute 49 seconds: Разобрался!) Если кому-то интересно, то вот:
Ничего странного. Адресация пословная. Отсюда, когда создаёшь константы директивой .db количество байтов должно быть четным. Компилятор предупреждает об этом, если нечётное. Поэтому, когда у тебя в массиве нечётное кол-во байтов, нужно дополнить до четного.
Байты не есть элементы. Элементов в массиве может быть сколько угодно. То, что их хранение обусловлено какими-то архитектурными особенностями не имеет к их количеству отношения (за исключением максимального размера)
Array это адрес, а не размер массива. Отсюда, непонятно, что вы получили этим "PC-Array"....
Естественно, Array - это адрес массива. PC - это счётчик команд. Вычитая из последнего значения счётчика начальный адрес (PC-Array), мы получаем размер массива в словах, который присваиваем константе Const_Word (Const_Word*2 - в байтах, соответственно). Что тут не понятного?)
Байты не есть элементы. Элементов в массиве может быть сколько угодно. То, что их хранение обусловлено какими-то архитектурными особенностями не имеет к их количеству отношения (за исключением максимального размера)
Такова архитектура AVR, увы, ничего с этим не поделаешь. Количество байт должно быть обязательно чётным и в одну строку, в случае ассемблерного кода! Если Вы пишите на сях массив с нечётным количеством элементов, то компилятор сам за Вас добавит этот чётный байт.
_________________ Окстись! Открой DataSheet и просветись!
ок. у меня массив из трех элементов, размер каждого элемента два байта. Теперь понятно? А если я пишу на "сях", как Вы умудрились выразиться, то компилятор поведет себя так, как я его настрою.
ок. у меня массив из трех элементов, размер каждого элемента два байта. Теперь понятно? А если я пишу на "сях", как Вы умудрились выразиться, то компилятор поведет себя так, как я его настрою.
Не надо путать тёплое с мягким. Речь шла про побайтовую запись, а не про пословную.
_________________ Окстись! Открой DataSheet и просветись!
Дядь, Вы по ходу дупля не отбиваете, что такое директивы ассемблера и как устроена память программ AVR ядра, да ещё пытаетесь дать какой-то "умный" совет
похоже вы и сами не отчетливо представляете о чем речь, поэтому не смогли просто и понятно пояснить человеку. вопрос не имеет отношение ни размерности элементов массива ни к четности кол-ва его байт. При многострочном применением инструкции .db (при нарезке одного массива для удобства восприятия) - именно в этом случае недопустимо в строке нечетное кол-во байт, кроме последней строки. причина в 16-битной адресации, при трансляции инструкций .db ... в код - массив не будет слитно склеиваться на стыках невыровненных (к адресации) байт.
это из ваших же ссылок.
П.С. некорректно выразился "16-битной адресации", но надеюсь понятно один шаг счетчика команд - два байта.
Последний раз редактировалось a797945 Вт июл 18, 2023 21:00:23, всего редактировалось 1 раз.
похоже вы и сами не отчетливо представляете о чем речь, поэтому не смогли просто и понятно пояснить человеку. вопрос не имеет отношение ни размерности элементов массива ни к четности кол-ва его байт. При многострочном применением инструкции .db (при нарезке одного массива для удобства восприятия) - именно в этом случае недопустимо в строке нечетное кол-во байт, кроме последней строки. причина в 16-битной адресации, при трансляции инструкций .db ... в код - массив не будет слитно склеиваться на стыках невыровненных (к адресации) байт.
это из ваших же ссылок.
Об этом писал ещё Demiurg в третьем ответе. Я привёл пачку ссылок, где можно было это всё прочесть. Объяснять всем тем, кто на бронепоезде - жизни не хватит
_________________ Окстись! Открой DataSheet и просветись!
Понаехали тут понаехи из си. Лезете в тему, так хоть разберитесь в вопросе. Куда вы суетесь, вумники, йоптыть. Ассемблер. Директива .db. Побайтовая запись. В этом случае нужно смотреть за четным количеством элементов массива. Пример. .db 0x02, 0xFF .db "Vasya Petya", 0x00
Директива .dw. Пословная запись. В этом случае не нужно смотреть за четным количеством байтов.
Что непонятно, господа понаехи?
ТС. Повторяю. Array это адрес. PC это счётчик команд. Текущая строка. Чревато ошибкой. Я сразу понял про что вы. Но, это ненадежный способ. Но не понял ваших мотивов использовать такой костыльный способ.
Откройте руководство AVR Assembler. Покажите мне слова array и element в описании .db (заодно прочитайте про упаковку) Вы не знаете ни Си, ни ассемблер.
Martian, Покажите мне свой проект на ассемблере. Не нужно кидаться словами "вы ничего не знаете". Я повторяю. В данный момент тема ассемблера. Это не си. И любой константный массив, это массив. И любой элемент массива, что побайтная запись, что пословная, это элемент массива. Либо вы слышите собеседника, либо валите хвастаться своим ай Кью в другом месте.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения