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

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

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

Сообщение Starichok51 »

chtulhu, сначала влево сдвигается младший регистр (ZL), а потом старший (ZH).
а чтобы не терялся бит при сдвиге, сдвиг нужно делать через перенос (rol ZH).
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
chtulhu
Родился
Сообщения: 10
Зарегистрирован: Вс апр 21, 2019 13:04:18

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

Сообщение chtulhu »

Игорь_396, Starichok51, спасибо за советы, Z регистр удваивается как должно, но у меня всё равно выходит какая-то ерунда. lpm по прежнему пишет в r0 значение 0xff (проверял в simavr). Сократил пример до минимально нерабочего

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

#define __SFR_OFFSET 0
	
#include	"avr/io.h"

	/* Секция кода */

	/*
1	0x000(1)	RESET	External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset
2	0x001	INT0	External Interrupt Request 0
3	0x002	INT1	External Interrupt Request 1
4	0x003	TIMER2 COMP	Timer/Counter2 Compare Match
5	0x004	TIMER2 OVF	Timer/Counter2 Overflow
6	0x005	TIMER1 CAPT	Timer/Counter1 Capture Event
7	0x006	TIMER1 COMPA	Timer/Counter1 Compare Match A
8	0x007	TIMER1 COMPB	Timer/Counter1 Compare Match B
9	0x008	TIMER1 OVF	Timer/Counter1 Overflow
10	0x009	TIMER0 OVF	Timer/Counter0 Overflow
11	0x00A	SPI, STC	Serial Transfer Complete
12	0x00B	USART, RXC	USART, Rx Complete
13	0x00C	USART, UDRE	USART Data Register Empty
14	0x00D	USART, TXC	USART, Tx Complete
15	0x00E	ADC	ADC Conversion Complete
16	0x00F	EE_RDY	EEPROM Ready
17	0x010	ANA_COMP	Analog Comparator
18	0x011	TWI	Two-wire Serial Interface
19	0x012	SPM_RDY	Store Program Memory Ready
	*/
	
	.section .text
	.org 0x0000
	
	rjmp RESET_vect
	reti	 		; INT0
	reti			; INT1
	reti			; TIMER2_COMP
	reti			; TIMER2_OVF
	reti			; TIMER1_CAPT
	reti			; TIMER1_COMPA
	reti			; TIMER1_COMPB
	reti			; TIMER1_OVF
	reti			; TIMER0_OVF
	reti			; SPI_STC
	reti			; USART_RXC
	reti			; USART_UDRE
	reti			; USART_TXC
	reti			; ADC
	reti			; EE_RDY
	reti			; ANA_COMP
	reti			; TWI
	reti			; SPM_RDY	
	
RESET_vect:
	ldi r16, RAMEND & 0xff
	out SPL, r16
	ldi r16, RAMEND >> 8
	out SPH, r16

	ldi r16, 0xff
	out DDRC, r16

	ldi r16, 0b00000000
	out PORTC, r16

	ldi ZL, lo8(variable)
	ldi ZH, hi8(variable)

	lsl ZL
	rol ZH
	
	lpm
	out PORTC, r0

_main:	
	rjmp _main

variable:
	.word 0xdead 

Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

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

   ldi ZL, lo8(variable)
   ldi ZH, hi8(variable)

   lsl ZL
   rol ZH
Забыл уже почти ассемблер. Но мне кажется, можно сразу указывать
ldi ZL, lo8(variable*2)
ldi ZH, hi8(variable*2)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
chtulhu
Родился
Сообщения: 10
Зарегистрирован: Вс апр 21, 2019 13:04:18

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

Сообщение chtulhu »

[uquote="Gudd-Head",url="/forum/viewtopic.php?p=4482197#p4482197"]

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

   ldi ZL, lo8(variable)
   ldi ZH, hi8(variable)

   lsl ZL
   rol ZH
Забыл уже почти ассемблер. Но мне кажется, можно сразу указывать
ldi ZL, lo8(variable*2)
ldi ZH, hi8(variable*2)
[/uquote]

Для ассемблера, который поставляется вместе с atmel studio да, можно указывать так. Но gcc-шный ассемблер выдаст ошибку. Как я понял, это связано с особенностями работты линковщика (или, если быть точнее -- с особенностями elf файлов) -- умножение и сложение взаимно нетранзитивны, и из-за этого итоговый адрес может быть неоднозначно определён (в зависимости от порядка вычислений). Генерируются ли elf файлы в ассемблере от авр, я не знаю
Последний раз редактировалось chtulhu Чт сен 28, 2023 18:39:12, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

А если через Сишный сдвиг вместо умножения?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
chtulhu
Родился
Сообщения: 10
Зарегистрирован: Вс апр 21, 2019 13:04:18

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

Сообщение chtulhu »

[uquote="Gudd-Head",url="/forum/viewtopic.php?p=4482233#p4482233"]А если через Сишный сдвиг вместо умножения? [/uquote]

То же самое. Сдвиги и прочие битовые операции запрещены, только сложение и вычитание с константами (var + var тоже не проходит). Вот тут https://stackoverflow.com/questions/184 ... binary-and об этом читал
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Херня какая-то, а не компилятор.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

chtulhu, а кто мешает взять студийный ассемблер?
Это ж не компилятор, который может по разному оптимизировать?

ПС. Попробуйте воспользоваться явным заданием целевого регистра
LPM Rd, Z
или
LPM Rd, Z+ - тут заодно и увеличится на 1 регистровая пара
Белая и Пушистая
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Указатель надо инкрементировать перед чтением следующего байта.
Много зависит от размещения данных в ПЗУ: побайтово, пословно, какая директива используется DB или DW (и как про то говорится в документации пользователя на имеющийся компилятор)...
Это только адрес метки начала массива нужно сдвигать на бит влево.
Чтение ВСЕГДА ПОБАЙТОВОЕ - сначала байт с адресом, содержащим B0 = 0, затем с адресом с b0=1.
Но то для avrasm2...
У GCC ассемблер имеет в основном вспомогательную функцию или потребуется весьма плотненько его документацию изучить...
:roll:
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

BOB51, "перед чтением следующего" и "после чтения текущего" в данной трактовке равнозначны. Но LPM Rd,Z+ позволяет и байт прочитать, и указатель подвинуть.
DB и DW относятся только к размещению. LPM всегда читает побайтово..
Белая и Пушистая
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Для АВРок у ПЗУ двойственность - вроде бы побайтовое, но команды то двухбайтовые и указатели на них (в том числе и на "метки" начала массивов) так же выставляются.
Результат чтения будет зависеть от того, как данные размещены в ПЗУ. При DW размещение оговорено(старший/младший байты слова) а вот при DB может быть произвольным.
Да и не всегда последовательное считывание выполняется.
К примеру - те же табличные кодеры/декодеры.
8)
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

BOB51, LPM - он байтовый. И адрес ему скармливается байтовый. И можно начинать читать и с нечетного адреса.
А вот метка может указывать только на слово. Отсюда и требование к выравниванию .DB до четного числа байт.
А организация хранения данных в ПЗУ - байтовая, пословная, big/little endian - это уже вопрос логики, но не команды LPM.
Белая и Пушистая
chtulhu
Родился
Сообщения: 10
Зарегистрирован: Вс апр 21, 2019 13:04:18

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

Сообщение chtulhu »

Вобщем, решение оказалось исключительно простым и очевидным, но только когда ты о нём знаешь. Оказывается, в gcc-шном ассемблере вообще не нужен этот сдвиг. Надо просто записать адрес как есть, в виде

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

	ldi ZL, lo8(table)
	ldi ZH, hi8(table)
а сдвигами, как я понял, занимается линковщик. Всем спасибо за участие, а я для себя за эти пару дней приобрёл чуть более глубокое понимание организации памяти и вообще плотно поработал с ассемблером.

На всякий случай, прикреплю эту https://eclipse.umbc.edu/robucci/cmpe31 ... _Assembly/ ссылку - там автор сравнивает аврный и гццшный ассемблер, и показывает, в чём они различаются
Последний раз редактировалось chtulhu Пт сен 29, 2023 21:31:46, всего редактировалось 1 раз.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

С тем GNUассемблером (для АВР) чаще встречаются те, что под GCC для АВРок работают.
Или кому надобно вставки для ардуино (и/или других семейств, поддерживаемых GNU Си) на ассемблере делать.
8)
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

Внезапно вопрос. Имею некое изделие чужого САНКЦИОНИРОВАННОГО авторства, которое нужно реанимировать (повторить изготовление) на ATmega165P. Проект написан в Студии на avrasm2. Я его пересобрал для MPLABX, благо с Божьей помощью и посредством PICkit4 через JTAG можно спокойно дебажить код.
Но есть нюанс. Я не обнаружил (видимо херово искал) в документации синтаксис инициализации ЕЕПРОМ в АСМ коде.
Потому и вопрос.
ЗЫ. Заодно может кто знает как и фьюзы включить в проект? А то MPLABX типа генерит код фьюзов для avrasm2, но с каким то странным файлом в инклюде - pega165p.inc и синтаксисом неизвестного генезиса.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Так а в чём вопрос-то?

З.Ы.: я в Студии фьюзы прошивал вручную, выставляя нужные галочки.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

Вопрос в том, как прошить еепром. У меня из инструментов есть только ПИККИТ4, то есть я могу работать только с МПЛАБ. МПЛАБ генерирует для еепрома отдельный файл в формате хекса - .eep (я понял как ЕЕПРОМ инициализировать в исходнике - в секции .eseg). Но я не вижу в среде как этот файл залить в чип.
Про фьюзы
Как прошить фьюзы в ручном режиме я знаю. Но это неудобно. Обнаружив, что МПЛАБ генерит код для фьюзов, я решил спросить кто-что об этом знает.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

В студии была отдельная кнопка для выбора файла и заливки данных в ЕЕПРОМ.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

У АВРок в отличии от ПИКов нет прямого доступа к фузам из файла исходника, аналогичного тому, что есть в шапке ПИКовых...
Прошивку с еепром из софт-оболочек "любительских" программаторов делать можно - там и окно кода и окно еепром и окошко фузов.
Систему комплектной прошивки делает ардуиноIDE при загрузке бутлоадера (для выбранной "платформы" и установленных в окне настроек/опций параметрах) - но как там все "обустроено" надо в самой IDE (и настройках используемой софтинки -аврдуде) копаться.
:roll:
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="BOB51",url="/forum/viewtopic.php?p=4487421#p4487421"]У АВРок в отличии от ПИКов нет прямого доступа к фузам из файла исходника, аналогичного тому, что есть в шапке ПИКовых...[/uquote]
Есть все у АВР. Просто Атмел зачем то создал такую ситуацию в ПО. А поскольку ПО теперь пишет Микрочип, то и расклады стали другими. Иначе МПЛАБ не генерил бы код для фьюзов, а в настройках четвертого ПИККИТа возможность прошивки фьюзов управляема.

Добавлено after 3 minutes 8 seconds:
[uquote="BOB51",url="/forum/viewtopic.php?p=4487421#p4487421"]Прошивку с еепром из софт-оболочек "любительских" программаторов делать можно[/uquote]
Мне не нужны любительские программаторы. У меня вообще работа идет через JTAG. Это позволяет иметь нормальную внутрисхемную отладку. Поэтому я произвольно меняю фьюзы и контроллер никогда не лочится.
Ответить

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