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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

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

Сообщение B@R5uk »

Народ, кто-нибудь пробовал сдвиг многобайтной величины на 4 бита вправо реализовывать через операцию SWAP? Можно ли выжать чутка быстродействия по сравнению с реализацией в лоб через RORы?

Добавлено after 10 minutes 48 seconds:
Судя по всему можно:
Спойлер

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

;============
mov     tmp1,   val1
mov     tmp2,   val2
mov     tmp3,   val3
lsr     tmp3
ror     tmp2
ror     tmp1
lsr     tmp3
ror     tmp2
ror     tmp1
lsr     tmp3
ror     tmp2
ror     tmp1
lsr     tmp3
ror     tmp2
ror     tmp1
;============
mov     tmp1,   val1
swap    tmp1
andi    tmp1,   0x0F
mov     tmp2,   val2
swap    tmp2
eor     tmp1,   tmp2
andi    tmp2,   0x0F
eor     tmp1,   tmp2
mov     tmp3,   val3
swap    tmp3
eor     tmp2,   tmp3
andi    tmp3,   0x0F
eor     tmp2,   tmp3
;============

Добавлено after 7 minutes 12 seconds:
Правда выигрыш всего в две операции, и он не растёт, если наращивать число байт в величине.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15544
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Это в пределах одного байта красиво смотрится.
А при многобайтовой цепочке придется промежуточный регистр да маски применить.
По итогу может и чуток быстрее, но сожрет дополнительные ресурсы в виде буфер-регистра.
:dont_know:
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

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

Сообщение B@R5uk »

[uquote="BOB51",url="/forum/viewtopic.php?p=3658411#p3658411"]...но сожрет дополнительные ресурсы в виде буфер-регистра.
:dont_know:[/uquote]Так вон, смотрите под катом: сдвинул три байта без буферов вообще. Правда мне нужен был и результат сдвига, и изначальная величина, поэтому у меня не занято лишних регистров. Если сдвигать на месте, то может и не получиться.

Добавлено after 6 minutes 50 seconds:
Впрочем, получится. На месте свапами тоже прекрасно шифтится:

Спойлер

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

;============
lsr     val3
ror     val2
ror     val1

lsr     val3
ror     val2
ror     val1

lsr     val3
ror     val2
ror     val1

lsr     val3
ror     val2
ror     val1
;============
swap    val1
andi    val1,   0x0F

swap    val2
eor     val1,   val2
andi    val2,   0x0F
eor     val1,   val2

swap    val3
eor     val2,   val3
andi    val3,   0x0F
eor     val2,   val3
;============
motorist82
Родился
Сообщения: 3
Зарегистрирован: Пт июл 12, 2019 16:12:19

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

Сообщение motorist82 »

Добрый день! Помогите пожалуйста!
Имеем пятибайтную константу, например

.equ NAME=0xE7E6E5E4E3

Как из неё взять старший байт для загрузки в РОН?
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

motorist82, боюсь, никак. Я просто не знаю 64-битного ассемблера для AVR. А 32-х битный с такой константой ничего сделать не сможет.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

вот так:
ldi R16, byte5(NAME)
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
motorist82
Родился
Сообщения: 3
Зарегистрирован: Пт июл 12, 2019 16:12:19

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

Сообщение motorist82 »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3665301#p3665301"]вот так:
ldi R16, byte5(NAME)[/uquote]

Так не получится. Нет такой функции byte5. Придется сохранять константу в Flash. Хотя студия не ругается на

.equ Name= 0xE7E6E5E4E3

Наверное все что свыше 32 бит просто игнорируется.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

Starichok51, А что это за ассемблер? Гнушный as меня конкретно посылает фразой "Error: bignum invalid"
Ну и про byte5 он ничего не знает.

Добавлено after 1 minute 30 seconds:
motorist82, пока константа в .equ - она для ассемблера просто строка для подстановки. Разбираться с ее содержимым он будет только при использовании имени из .equ
motorist82
Родился
Сообщения: 3
Зарегистрирован: Пт июл 12, 2019 16:12:19

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

Сообщение motorist82 »

Спасибо
Вот макрос который суёт константу во Flash:

#define Address(v,w,x,y,z) NRF24_Addr: .db $##z, $##y, $##x, $##w, $##v

Используем так:

Address (E7,E6,E5,E4,E3)

Достаём из Flash:

ldZ (NRF24_Addr*2)
ldi R17, 5

Get_NRFAddr_Loop: lpm R16, Z+
dec R17
; Тут сохраняем R16 в какой-нибудь буфер для дальнейшего использования
brne Get_NRFAddr_Loop
[/code]
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

извиняюсь, я это "с потолка" взял.
byte4 работает, и я решил, что и byte5 будет работать.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
B@R5uk
Собутыльник Кота
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

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

Сообщение B@R5uk »

[uquote="motorist82",url="/forum/viewtopic.php?p=3665189#p3665189"].equ NAME=0xE7E6E5E4E3

Как из неё взять старший байт для загрузки в РОН?[/uquote]
А выражение

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

(NAME >> 32) & 0xFF

не взлетит?
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

если сделать
(NAME >> 32)
то
& 0xFF
уже не нужно делать.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

[uquote="B@R5uk",url="/forum/viewtopic.php?p=3666150#p3666150"]А выражение

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

(NAME >> 32) & 0xFF

не взлетит?[/uquote] Не взлетит. AVR-студия заносит 0xFF. Если через BYTE5, то заносит 0x00.

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

.equ   NAME=996011271395
;.equ   BYTE5=NAME/4294967296
;.equ NAME=0xE7E6E5E4E3

.cseg
RESET:
   RJMP   START
CONST:
;.DB   0,BYTE5,BYTE4(NAME),BYTE3(NAME),BYTE2(NAME),BYTE1(NAME)
;.DB   0,NAME >> 32,BYTE4(NAME),BYTE3(NAME),BYTE2(NAME),BYTE1(NAME)
.DB      0,(NAME >> 32) & 0xFF,BYTE4(NAME),BYTE3(NAME),BYTE2(NAME),BYTE1(NAME)

START:
   LDI   ZH,HIGH(CONST*2)
   LDI   ZL,LOW(CONST*2)

   LPM   R10,Z+
   LPM   R11,Z+
   LPM   R12,Z+
   LPM   R13,Z+
   LPM   R14,Z+
   LPM   R15,Z


   RJMP   START
DimKra
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс мар 24, 2013 17:21:28

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

Сообщение DimKra »

Вопрос знатокам: В AVR есть такой скрытный зверёк - регистр "PC", счётчик инструкций. Хотел узнать о нём поподробнее, как то например по какому физическому адреcу он сидит, можно ли его прочесть напрямую из программы ? Гугль молчит как партизан, неужели нигде нет подробной информации на этот счёт?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

А зачем Вам знать это? Всё равно попытка прочитать этот регистр из программы давала бы как раз номер той инструкции, которой этот регистр читается. Что чуть менее чем бесполезно.
DimKra
Открыл глаза
Сообщения: 63
Зарегистрирован: Вс мар 24, 2013 17:21:28

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

Сообщение DimKra »

WiseLord, думаю большей степени научное любопытство :) Ну может и пригодится для дебага, если будет возможность хотя бы читать.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

DimKra, через CALL на следующую после него инструкцию и два (три для некоторых AVR) POP можете его значения получать. Но толку с него действительно немного.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Практического смысла нет. Смотрим описание этого регистра. Работает с командами rjmp, jmp, rcall, cal.

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

rjmp pc +\- x

Глухое зацикливание программы rjmp pc + 0.
Так как команды бывают двух и четырех байтные, заманаешься вручную высчитывать насколько команд нужно прыгнуть. Именно по этой причине крайне не рекомендуется работает вручную. Только по меткам.

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

Label_1:
bla-bla
rjmp +\- Label_x
bla-bla
Label_2:
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Он-то регистр, но недоступен для чтения напрямую. Но с ним можно работать некоторыми командами - всевозможные команды перехода и возврата из подпрограммы.
Толку его читать? Он всегда указывать удет на ту инструкцию которой его прочитаешь, а это известно и так на этапе компиляции(переносимый по адресному пространству код под AVR я не видел).
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15544
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

DimKra
Модификация содержимого PC производится "подстановкой адреса возврата через стек", командами call, jmp, коротких условных переходов и косвенных переходов ijmp, icall с подстановкой адреса из регистровой пары R31:R30 (она же Z).
Чтение... в принципе в некоторых случаях может иметь смысл (к вопросам отладки например) - тогда выполняем любой вызов call и считываем точку входа из верхушки стека.
8)
Ответить

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