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

Обсуждаем контроллеры компании Atmel.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

да, перескочить... но как часто требуется такой переход? Чаще ведь используется вызов подпрограмм, поэтому на самом деле JMP используется довольно редко и только в ограниченном количестве ситуаций. А вот вызов - CALL и RCALL - гораздо чаще, и причем ведь подобное "удлинение" для rcall будет кривым. А если целые толпы удлинителей устремятся с младших адресов в старшие? Это ведь ужас будет.
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

FreshMan писал(а):Jack_A, а шо такое +-2k ?

Два килоома. Или два килослова.
Реклама
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

да......, трудно понять профану профи :))
выяснил следующее:
вся команда rjmp весит слово
код команды весит старшие 4 бита старшей тетрады
оставшихся 12 бит хватает только чтобы заадресовать 4кБ
Tell Me The Truth
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

FreshMan, и ещё в догонку - jmp выполняется дольше rjmp на один такт.
Адресуется 4 кило (+-2) машинных слов. Т.е. на МК с памятью 8кБайт и меньше можно обходиться только rjmp\rcall.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15554
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Ну можно еще с табличками поизголяться или ijmp/icall - если предварительно Z загружен...
:roll:
Реклама
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

Kavka писал(а):jmp выполняется дольше rjmp на один такт.

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

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

Сообщение Kavka »

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

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

Сообщение FreshMan »

имеются такие команды ADD и ADC ----- сложение двух РОН без учета и с учетом переноса
что это за перенос ?
зачем он нужен ?
Tell Me The Truth
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Байт может, скажем так, хранить число от 0 до 255.
Складываем любые два байта. Если результат меньше или равен 255, то всё хорошо. А если результат больше 255, то нужно место куда деть самый старший бит. Вот таким местом и является флаг переноса. Точнее он всегда записывается будь он 0 или 1.
Используется когда надо сложить многобайтовые числа. Как при сложении в столбик, когда "в уме" запоминают сколько надо добавить к следующему разряду (ну, типа того :) ).
Например, сложение 16-битных чисел.

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

; Add R1:R0 to R3:R2
add r2,r0 ; Add low byte
adc r3,r1 ; Add with carry high byte

Но это не единственное применение флага переноса. :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

ADC прибавляет еще +1 к результату если флаг переноса установлен, нужно это для сложения многобайтных чисел - перенос в данном случае, это признак переполнения в младших разрядах.

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

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

Сообщение FreshMan »

Kavka писал(а):Используется когда надо сложить многобайтовые числа.

допустим нам надо сложить 255 и 10
результат явно будет больше чем 255 :))
выходит в этом случае мы слажываем, получаем 265 и устанавливаем флаг переноса
так ?
Tell Me The Truth
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

слажываем
:shock:
Теперь надо представить, что из себя представляет число 265. Ясное дело в один регистр оно не поместится. Надо как минимум два: в первом у нас будет единица, а во втором - девять. То есть 1х256+9
Это как в обычной арифметике: 9+1 уже нельзя записать одной цифрой, будет 1 десяток и 0 единиц.

Теперь посмотрим, как работает флаг переноса. Если мы напишем ADD R1, R2 (R1 было 255, R2 было 10) то в результате мы получим девятку в R1 и всё. Как узнать, что было переполнение? Да очень просто, у нас включится флаг C. И в следующей операции мы можем использовать команду ADC, он прибавит лишнюю единицу к результату.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

FreshMan писал(а):получаем 265 и устанавливаем флаг переноса?

Нет. Получаем "9" и установленный флаг переноса, который как бы является 9-м (№8) битом:
1 0000 1001
С реги стр_
И если засунуть этот флаг в другой регистр, получим число в двух байтах:
0000 0001 0000 1001
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

ну хорошо, а как быть когда нам надо сложить 768+255=1023
тут уже одним флагом переноса не обойтись
Изображение
Tell Me The Truth
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Ещё как обойтись.
768 — 0000 0011 0000 0000
255 — 0000 0000 1111 1111
Складываем младшие байты: 1111 1111 (здесь вообще переполнения нет, флаг С нулевой) и старшие с учётом С: 0000 0011. Получаем 1023: 0000 0011 1111 1111.

Просто сложив ДВА 8-битных числа (макс. 255) не получить число, занимающее больше ДЕВЯТИ бит (макс. 511). Девятый бит — С прибавляется к более старшему байту, и так можно до бесконечности.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

шо то я мальца запутался
посоветуйте какой мне ликбез почитать по данному поводу
Tell Me The Truth
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Начни с арифметики. Сначала с десятичной, как в столбик учили складывать. И точно так же работает и двоичная арифметика, только правил еще меньше: 0+0 = 0, 1+0=1, 0+1=1 1+1 = 0+1 в старший разряд

рассмотрим такой любопытный случай: 00001111 + 00000001

Складываем пошагово начиная с младших разрядов:
1+1 = 0 + перенос
1+0+перенос = 1+1 = 0 + перенос
1+0+перенос = 1+1 = 0 + перенос
1+0+перенос = 1+1 = 0 + перенос
0+0+перенос = 1
0+0 = 0
0+0 = 0
0+0 = 0

В итоге имеем результат: 00010000

http://ru.wikipedia.org/wiki/%D0%94%D0% ... 0%B8%D1%8F
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

Alexeyslav, спасибо за наглядный пример !
Tell Me The Truth
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

команды типа out portb,r... не могут использовать r0-r15, поэтому temp=r16

почему ?
Tell Me The Truth
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

А вот такую "фишку" придумали в ATMEL. Чтоб жизнь мёдом не казалась
Ответить

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