Ассемблер (ASM) для AVR в вопросах и ответах
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
да, перескочить... но как часто требуется такой переход? Чаще ведь используется вызов подпрограмм, поэтому на самом деле JMP используется довольно редко и только в ограниченном количестве ситуаций. А вот вызов - CALL и RCALL - гораздо чаще, и причем ведь подобное "удлинение" для rcall будет кривым. А если целые толпы удлинителей устремятся с младших адресов в старшие? Это ведь ужас будет.
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
FreshMan писал(а):Jack_A, а шо такое +-2k ?
Два килоома. Или два килослова.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
да......, трудно понять профану профи
выяснил следующее:
вся команда rjmp весит слово
код команды весит старшие 4 бита старшей тетрады
оставшихся 12 бит хватает только чтобы заадресовать 4кБ
выяснил следующее:
вся команда rjmp весит слово
код команды весит старшие 4 бита старшей тетрады
оставшихся 12 бит хватает только чтобы заадресовать 4кБ
Tell Me The Truth
Re: Ассемблер (ASM) для AVR в вопросах и ответах
FreshMan, и ещё в догонку - jmp выполняется дольше rjmp на один такт.
Адресуется 4 кило (+-2) машинных слов. Т.е. на МК с памятью 8кБайт и меньше можно обходиться только rjmp\rcall.
Адресуется 4 кило (+-2) машинных слов. Т.е. на МК с памятью 8кБайт и меньше можно обходиться только rjmp\rcall.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну можно еще с табличками поизголяться или ijmp/icall - если предварительно Z загружен...

- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Kavka писал(а):jmp выполняется дольше rjmp на один такт.
а шо это критично ?
я начинал осваивать МК с Си и там такты никто не считает
Tell Me The Truth
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Те кто начинают может и не считают такты, а настоящие падаваны и джедаи должны знать как компилятору внушить с помощью великой силы, чтобы он использовал rjmp вместо jmp там где можно.
Но это тема не про Си... 
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
имеются такие команды ADD и ADC ----- сложение двух РОН без учета и с учетом переноса
что это за перенос ?
зачем он нужен ?
что это за перенос ?
зачем он нужен ?
Tell Me The Truth
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Байт может, скажем так, хранить число от 0 до 255.
Складываем любые два байта. Если результат меньше или равен 255, то всё хорошо. А если результат больше 255, то нужно место куда деть самый старший бит. Вот таким местом и является флаг переноса. Точнее он всегда записывается будь он 0 или 1.
Используется когда надо сложить многобайтовые числа. Как при сложении в столбик, когда "в уме" запоминают сколько надо добавить к следующему разряду (ну, типа того
).
Например, сложение 16-битных чисел.
Но это не единственное применение флага переноса.
Складываем любые два байта. Если результат меньше или равен 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 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ADC прибавляет еще +1 к результату если флаг переноса установлен, нужно это для сложения многобайтных чисел - перенос в данном случае, это признак переполнения в младших разрядах.
Так же этот флаг активно учавствует в командах циклического сдвига влево и вправо - весь сдвиг происходит через этот флаг переноса, как в пятнашках.
Так же этот флаг активно учавствует в командах циклического сдвига влево и вправо - весь сдвиг происходит через этот флаг переноса, как в пятнашках.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Kavka писал(а):Используется когда надо сложить многобайтовые числа.
допустим нам надо сложить 255 и 10
результат явно будет больше чем 255
выходит в этом случае мы слажываем, получаем 265 и устанавливаем флаг переноса
так ?
Tell Me The Truth
Re: Ассемблер (ASM) для AVR в вопросах и ответах
слажываем
Теперь надо представить, что из себя представляет число 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 в вопросах и ответах
FreshMan писал(а):получаем 265 и устанавливаем флаг переноса?
Нет. Получаем "9" и установленный флаг переноса, который как бы является 9-м (№8) битом:
1 0000 1001
С реги стр_
И если засунуть этот флаг в другой регистр, получим число в двух байтах:
0000 0001 0000 1001
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Tell Me The Truth
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ещё как обойтись.
768 — 0000 0011 0000 0000
255 — 0000 0000 1111 1111
Складываем младшие байты: 1111 1111 (здесь вообще переполнения нет, флаг С нулевой) и старшие с учётом С: 0000 0011. Получаем 1023: 0000 0011 1111 1111.
Просто сложив ДВА 8-битных числа (макс. 255) не получить число, занимающее больше ДЕВЯТИ бит (макс. 511). Девятый бит — С прибавляется к более старшему байту, и так можно до бесконечности.
768 — 0000 0011 0000 0000
255 — 0000 0000 1111 1111
Складываем младшие байты: 1111 1111 (здесь вообще переполнения нет, флаг С нулевой) и старшие с учётом С: 0000 0011. Получаем 1023: 0000 0011 1111 1111.
Просто сложив ДВА 8-битных числа (макс. 255) не получить число, занимающее больше ДЕВЯТИ бит (макс. 511). Девятый бит — С прибавляется к более старшему байту, и так можно до бесконечности.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
шо то я мальца запутался
посоветуйте какой мне ликбез почитать по данному поводу
посоветуйте какой мне ликбез почитать по данному поводу
Tell Me The Truth
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Начни с арифметики. Сначала с десятичной, как в столбик учили складывать. И точно так же работает и двоичная арифметика, только правил еще меньше: 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
рассмотрим такой любопытный случай: 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
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Alexeyslav, спасибо за наглядный пример !
Tell Me The Truth
Re: Ассемблер (ASM) для AVR в вопросах и ответах
команды типа out portb,r... не могут использовать r0-r15, поэтому temp=r16
почему ?
Tell Me The Truth
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А вот такую "фишку" придумали в ATMEL. Чтоб жизнь мёдом не казалась


