Обсуждаем контроллеры компании Atmel.
Ответить

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

Пт июн 28, 2019 19:12:12

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

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

Добавлено after 7 minutes 12 seconds:
Правда выигрыш всего в две операции, и он не растёт, если наращивать число байт в величине.

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

Сб июн 29, 2019 06:44:11

Это в пределах одного байта красиво смотрится.
А при многобайтовой цепочке придется промежуточный регистр да маски применить.
По итогу может и чуток быстрее, но сожрет дополнительные ресурсы в виде буфер-регистра.
:dont_know:

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

Сб июн 29, 2019 18:27:26

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

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

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

Пт июл 12, 2019 16:39:32

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

.equ NAME=0xE7E6E5E4E3

Как из неё взять старший байт для загрузки в РОН?

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

Пт июл 12, 2019 19:23:10

motorist82, боюсь, никак. Я просто не знаю 64-битного ассемблера для AVR. А 32-х битный с такой константой ничего сделать не сможет.

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

Пт июл 12, 2019 20:17:12

вот так:
ldi R16, byte5(NAME)

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

Пт июл 12, 2019 21:49:20

вот так:
ldi R16, byte5(NAME)


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

.equ Name= 0xE7E6E5E4E3

Наверное все что свыше 32 бит просто игнорируется.

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

Пт июл 12, 2019 21:55:40

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

Добавлено after 1 minute 30 seconds:
motorist82, пока константа в .equ - она для ассемблера просто строка для подстановки. Разбираться с ее содержимым он будет только при использовании имени из .equ

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

Пт июл 12, 2019 22:05:23

Спасибо
Вот макрос который суёт константу во 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]

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

Сб июл 13, 2019 04:58:08

извиняюсь, я это "с потолка" взял.
byte4 работает, и я решил, что и byte5 будет работать.

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

Вс июл 14, 2019 19:42:28

.equ NAME=0xE7E6E5E4E3

Как из неё взять старший байт для загрузки в РОН?

А выражение
Код:
(NAME >> 32) & 0xFF

не взлетит?

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

Вс июл 14, 2019 20:02:10

если сделать
(NAME >> 32)
то
& 0xFF
уже не нужно делать.

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

Пн июл 15, 2019 06:33:10

А выражение
Код:
(NAME >> 32) & 0xFF

не взлетит?
Не взлетит. 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

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

Пн сен 16, 2019 14:15:18

Вопрос знатокам: В AVR есть такой скрытный зверёк - регистр "PC", счётчик инструкций. Хотел узнать о нём поподробнее, как то например по какому физическому адреcу он сидит, можно ли его прочесть напрямую из программы ? Гугль молчит как партизан, неужели нигде нет подробной информации на этот счёт?

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

Пн сен 16, 2019 14:19:01

А зачем Вам знать это? Всё равно попытка прочитать этот регистр из программы давала бы как раз номер той инструкции, которой этот регистр читается. Что чуть менее чем бесполезно.

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

Пн сен 16, 2019 14:46:34

WiseLord, думаю большей степени научное любопытство :) Ну может и пригодится для дебага, если будет возможность хотя бы читать.

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

Пн сен 16, 2019 15:59:47

DimKra, через CALL на следующую после него инструкцию и два (три для некоторых AVR) POP можете его значения получать. Но толку с него действительно немного.

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

Пн сен 16, 2019 17:34:09

Практического смысла нет. Смотрим описание этого регистра. Работает с командами rjmp, jmp, rcall, cal.
Код:
rjmp pc +\- x

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

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

Пн сен 16, 2019 19:32:07

Он-то регистр, но недоступен для чтения напрямую. Но с ним можно работать некоторыми командами - всевозможные команды перехода и возврата из подпрограммы.
Толку его читать? Он всегда указывать удет на ту инструкцию которой его прочитаешь, а это известно и так на этапе компиляции(переносимый по адресному пространству код под AVR я не видел).

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

Вт сен 17, 2019 08:52:33

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