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

Обсуждаем контроллеры компании Atmel.
Ответить
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

FreshMan писал(а):и снова о старом:
rcall годится при обьеме памяти до 8к
call годится при обьеме памяти до 64к
а что же используется в тех МК где память перевалила за рубеж 64к ? :dont_know:
Начнём с того, что слово объём пишется с твёрдым знаком. :shock: :kill:
Далее. Вы странный какой-то. Что ж вы про BRNE и и прочие BRxx не написали. А они вообще +-64 слова позволяют прыгать. И что, по вашему, их нигде нельзя использовать? :)
Продолжим. RCALL/RJMP прыгают на +-2 килослова, что соответствует +-4 килобайта, т.е. 8 кб. Тут нормально.
А вот CALL/JMP адресуют 64 килослова, т.е. вплоть до 128 килобайт никаких наворотов в виде EICALL/EIJMP не требуется.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Kavka писал(а):Начнём с того, что слово объём пишется с твёрдым знаком.
покорнейше прошу меня извинить, если это вас так задело......, училися я в украинской школе и русский язык знаю по наслышке, поэтому покорнейше прошу вас не презирать меня за это :))
по остальному: буду учить :tea:
Tell Me The Truth
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Не, не задело. Надо же с чего то начать. :)
Меня самого тут поймали и носом ткнули, что с ошибками написал. :roll:
Так что никто не застрахован от ошибок. Поторопились, отвлеклись там, или ещё чего и опа... :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

правильно ли я разумею

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

add	r22,r23	
brcc	nocarry     	
если при сложении двух регистров их сумма не превысит 255 и соответственно не будет переноса то только тогда мы прыгнем на строчку nocarry
Tell Me The Truth
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Правильно.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

штудирую ликбез http://radiokot.ru/start/mcu_fpga/avr/12/
не совсем понятно вот это место
Изображение
может кто в силах обяснить более понятно зачем там умножение на 2 ?
Tell Me The Truth
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

А что именно из написанного до тебя не доходит? дескать, чтобы умножить на два зачем мы умножаем на два?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

как известно под названием массива скрывается адрес его нулевого элемента

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

MyArray:
.db 12,16,3,4,10,17,255,37,158,14,13,98
и если бы было написано вот так

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

ldi ZH,High(MyArray) ;загрузка адреса 0-го
ldi ZL,Low(MyArray)  ;элемента в рег. пару Z
то это бы не вызвало никаких недоумений
но там записано вот так

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

ldi ZH,High(MyArray*2) ;загрузка адреса 0-го
ldi ZL,Low(MyArray*2)  ;элемента в рег. пару Z
кто может разжевать зачем там идет умножение на 2 ?
Tell Me The Truth
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Разуй глаза, в том отрывке который ты дал - там написано объяснение почему так. Неужели не видишь?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Alexeyslav, да вижу я все
то обяснение для меня ничего не обясняет
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Свежий, через Z (во флэше) адресуются команды длиной 2 байта, константы имеют длину 1 байт. Для того и умножают.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Да уж объяснил так еще больше запутал.

На самом деле, метки - это числовые адреса команд. Поскольку, к памяти обращаемся мы побайтно, а адрес метки дан для 16-битной организации адресного пространства, то адрес-метку нужно умножать на два.
Причем, <метка>*2 адресует один байт, а <метка>*2+1 адресует следующий байт. Поэтому у вас в примере ошибка - старшая и младшая часть слова у вас будут равны одному и тому же байту из памяти.
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

FreshMan, для AVR метки во флэш-памяти представляют собой адрес в машинных словах. А машинное слово у 8-битных AVR-ок равно, как ни странно, 16 битам, т.е. 2-м байтам. Доступ к памяти с помощью команд LPM/SPM производится с точностью до байта.

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

Адрес в машинных словах (по 16 бит)
  0       1       2       3       4       5       6       7       8       9
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--
  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
Адрес в байтах
Допустим метка DAT имеет значение 7 и надо достать оттуда один байт. Так как машинное слово равно двум байтам, то 7*2=14. Вот и надо достать байт по адресу 14.
Чтобы быть ещё более точным, то адресация в словах работает только в сегменте кода (.cseg). В сегменте данных (.dseg) и EEPROM (.eseg) адреса в байтах.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Kavka писал(а):А машинное слово у 8-битных AVR-ок равно, как ни странно, 16 битам, т.е. 2-м байтам.
а шо может быть и по другому ?
слово может иметь другой размер ?
Tell Me The Truth
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Разумеется. Машинное слово бывает от 5 (если не ошибаюсь) до 128 бит и зависит исключительно от архитектуры АЛУ.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Как ни странно, и байт и слово может иметь другой размер.
Название «байт» (слово byte представляет собой сокращение словосочетания BinarY TErm — «двоичный терм») было впервые использовано в 1956 году В. Бухгольцем (англ. Werner Buchholz) при проектировании первого суперкомпьютера IBM 7030 (англ.) для пучка одновременно передаваемых в устройствах ввода-вывода шести битов. Позже, в рамках того же проекта, байт был расширен до восьми бит.

Ряд ЭВМ 1950-х и 1960-х годов (БЭСМ-6, М-220) использовали 6-битовые символы в 48-битовых или 60-битовых машинных словах. В некоторых моделях ЭВМ производства Burroughs Computer Corporation (англ.) (ныне Unisys) размер символа был равен 9 битам. В советской ЭВМ Минск-32 использовался 7-битный байт. Постепенно 8-битные байты стали стандартом де-факто; с начала 1970-х в большинстве компьютеров байты состоят из 8 бит, а размер машинного слова кратен 8 битам.
(с) Википедия
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Alexeyslav, да, оно конечно так, но сегодня понятие "байт" устоялось в значении "группа из 8-ми бит". :)

FreshMan, например у архитектуры ARM, в оригинальном наборе инструкций, 32-битное машинное слово. Позже у ARM появился режим Thumb, в котором машинное слово 16-битное.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

FreshMan писал(а):а шо может быть и по другому ?
У 8051 слово команды длиной 1, 2 и 3 байта.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Gudd-Head, 8051 это CISC. И к нему термин "машинное слово" применимо с оговорками. Там, скорее, "длинна команды".
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Всё, FreshMan в ауте.
Docendo discimus
Контактная информация:
Ответить

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