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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

ИС-пытатель писал(а):через флаг Carry (C) делаются такие штуки. SBIW....
Только dec для работы с 2-байтовым числом использовать нельзя , нужно subi RX,1. Казалось бы - какая разница ? Есть разница. Dec не устанавливает флаг С , поэтму brcs/brcc - мимо .
Реклама
Аватара пользователя
Muzykant
Нашел транзистор. Понюхал.
Сообщения: 192
Зарегистрирован: Вт дек 24, 2013 17:22:18
Откуда: Ярославль

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

Сообщение Muzykant »

Engineer_Keen писал(а): Не знаю как в железе (думаю что поддерживается), но в симуляторах работает.

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

.org	0
.db	0xFD,0xCF ;аналог RJMP на 1 адрес вниз
.org	0x1FFE
.db	0x01,0xC0 ;аналог RJMP  на 1 адрес вверх
Вот что нагуглил по поводу .db
DB - определить байт(ы) в программной памяти или в EEPROM

Директива DB резервирует ресурсы памяти в программной памяти или в EEPROM. Директиве должна предшествовать метка. DB задает список выражений, и должна содержать по крайней мере одно выражение. Размещать директиву следует в сегменте кодов или в EEPROM сегменте.

Список выражений представляет собой последовательность выражений, разделенных запятыми. Каждое выражение должно быть величиной между –128 и 255.

Если директива указывается в сегменте кодов и список выражений содержит более двух величин, то выражения будут записаны так, что 2 байта будут размещаться в каждом слове Flash-памяти.

Синтаксис:

LABEL: .DB список выражений

Пример:

.CSEG
consts: .DB 0, 255, 0b01010101, -128, 0xaa
.ESEG
const2: .DB 1,2,3
И практически ничего не понял.. Или к Вашему коду это не имеет отношения и Вы как-то по другому используете директиву?
Реклама
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

И практически ничего не понял.. Или к Вашему коду это не имеет отношения и Вы как-то по другому используете директиву?
Директива использована для вставки машинного кода в текст программы, чтобы компилятор схавал.
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

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

Сообщение ИС-пытатель »

Директивой он записывает байты память программ. Эти байты не отделены jmp-ми. т.е. по сути это не переменные какие-то или константы, а самые натуральные команды процессору. Причем, обратите внимание, байты записаны по два (слово) и в обратном порядке (сначала младший, потом старший).

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

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

Сообщение Alexeyslav »

Директива эта проста до безобразия, она просто говорит компилятору: "хочу в этом месте вставить ЭТИ байты" причем, это не описано в документации но память программ адресуется словами, поэтому нечетное количество байт в СТРОКЕ будет выровнено до четного и дано соответствующее предупреждение. А уж как эти байты будут использоваться в конкретном месте... уже не помню где я видел, но для x86 процессоров был такой прикол - исполняемый файл в виде осмысленной стоки текста, на самом деле это были инструкции процессору - все зависит от того как и чем интерпретировать данные.
Реклама
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

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

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

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

А что из себя файл представляет? И что вы хотите получить в итоге?
.include "file.asm" например. Только файл должен быть правильный чтобы компилятор не ругался :)))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

C "file.asm" понятно, его компилятор вставляет как часть текста проги, а мне нужна именно бинарная вставка, т.е. такая директива, которая предполагает вставку абсолютно любого файла в любом формате, как просто блок данных и компилятору должно быть пофиг, что содержит файл. Например как в Easy68k:
Спойлер

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

; Processor:	    68302
; Target Assembler: 680x0 Assembler in MRI compatible mode
;=========
; segment "ROM"
         
		include	"mc68302def.x68"
CLK		equ		15000000 		System clock Hz
stack	equ		$d90			Stack pointer
V_gimr	equ		%101<<V5		V7-V5 in GIMR register
I_vect	equ		(V_gimr+ISCC3)*4	Interrupt Vector for SCC3
stktemp	equ		END_SYS_RAM		Stack pointer

		MEMORY	ROM	$000000,$200000

		org		$0				start at the beginning
		incbin "GS7000.bin"

		ORG     $0
off_000	dc.l    $0D90
off_004	dc.l    START
		dcb.l   $3A,$80082E
off_0F0	dc.l    0,0,0,0
		dcb.l   $C0,$80082E
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Такой директивы нет, но... все можно обойти! Пишется утилита(на турбопаскале, бейсике), которая конвертирует двоичный файл в текстовый с HEX-кодами и директивами .DW в каждой строке и делов. Если надо каждую перекомпиляцию чтобы коды обновлялись - вставить вызов в скрипт выполнения действий до компиляции. И делов. Я когда-то подобную программу делал для псевдоязыка которая генерировала правильно оформленные двоичные инклуды.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Собственно, на данный момент так и делаю.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Alexeyslav писал(а):Пишется утилита(на турбопаскале, бейсике), которая конвертирует двоичный файл в текстовый с HEX-кодами и директивами .DW в каждой строке и делов.
Иманно ! :)) А как иначе еще вбить длинные тексты в кодах ЖКИ на HD44780 и его аналогах? Написал простенькую прогу, "сам сачкую, а она работает" (С) А.Галич
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

Привет, коты! :)
Такое вот дело, я попробовал использовать регистр чисто для флагов. Получилось очень даже здорово (чего я раньше не додумался?). Но учитывая что в байте 8 бит, было бы здорово для удобства и быстроты все эти биты как-нибудь назвать.
Я полез в inc файл, чтобы посмотреть, как это сделано с регистрами конфигурации МК. Первый бит, который мне пришёл в голову - RXC для UARTа. Написал его в поиск и увидел такую штуку:

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

; UCSR0A - USART Control and Status Register A
.equ	MPCM0	= 0	; Multi-processor Communication Mode
.equ	U2X0	= 1	; Double the USART transmission speed
.equ	UPE0	= 2	; Parity Error
.equ	DOR0	= 3	; Data overRun
.equ	FE0	= 4	; Framing Error
.equ	UDRE0	= 5	; USART Data Register Empty
.equ	TXC0	= 6	; USART Transmitt Complete
.equ	RXC0	= 7	; USART Receive Complete
Дальше я решил поискать R25 (у меня он в программе используется как статусный), но нашлось только вот это:

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

; GPIOR2 - General Purpose I/O Register 2
.equ	GPIOR20	= 0	; 
.equ	GPIOR21	= 1	; 
.equ	GPIOR22	= 2	; 
.equ	GPIOR23	= 3	; 
.equ	GPIOR24	= 4	; 
.equ	GPIOR25	= 5	; 
.equ	GPIOR26	= 6	; 
.equ	GPIOR27	= 7	; 
Вот у меня вопрос, как-то можно через этот файл назвать биты регистра общего назначения, чтобы потом удобнее было с ними работать?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3870
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

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

Сообщение Engineer_Keen »

Только inc-файл не трогайте. Обзывайте эти биты как хотите или в главном файле (в начале кода) или в любом другом самописном файле, подключенном к проекту. Я например все определения и константы всегда выношу в отдельный файл, там гораздо удобнее и править.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

А можете подсказать, каким образом привязаться именно к конкретным битам конкретного регистра? Вы же не называете, например 0 буквой А(соответственно все 0 в программе), 1 буквой Б и т.п.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Мikа писал(а):Первый бит, который мне пришёл в голову - RXC для UARTа.
Замечу, RXC не доступен для записи. Лучше использовать UBRR, если в камне нет GPIO.
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

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

Сообщение ИС-пытатель »

Все биты уже привязаны. В том же инклуде. Не изобретайте велосипед. А те, которые не привязаны можете обозвать сами через .def.
Например:

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

.def ABCDE=7

Фактически, Вы присваиваете здесь константе ABCDE число 7. И далее в программе можете использовать его для обращения к этому биту. Это нужно для того, чтобы допустим не забыть какой номер бита соответствует какому флагу в программе (из тех флагов, что Вы понапридумывали).
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

ИС-пытатель писал(а):Например:

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

.def ABCDE=7
:shock: Извините, но это ошибка.
Другой пример
Спойлер

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

	.equ	SCK=7
	.equ	DOUT=5
	.equ	SPI_IRQ=3
	.equ	SPI_CS=4
	.equ	SW_EN=6

	.def	_FF=R1
	.def	_01=R2
	.def	BIAS=R19


	.def	R_COUNT=R17
	.def	R_CRC=R18

	.def	R_DATA=R22

	.equ	BEGIN_POINT=$C0		; буфер памяти результата

	.equ	RAM_CONST=$70
	.equ	RAM_CONST_END=$B0

	.equ	BUF_COMAND=$60
	.equ	BUF_COMAND_END=$64

	.equ	N1_RAM=$80	; 32 байта скользящего среднего N1
	.equ	N2_RAM=$A0	; 32 байта скользящего среднего N2

	.set	PRIZ=0
	.set	PR_INIT=1
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3870
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

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

Сообщение Engineer_Keen »

Ого, set, я и не знал что им кто-то пользуется... Мне обычно equ хватает. А def да, только для переопределения РОН.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

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

Сообщение ИС-пытатель »

Ну, да, конечно же .equ или .set )) Ох уж эта каша в голове.. ) В Си #define. Ща прогу стряпаю с большим их количеством - вот .def и всунул с разгону. ))
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

Парни, так я как раз о том и говорю, что если присвоить имя какому-нибудь числу через

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

.equ   MPCM0   = 0
то это просто обзывание нуля таким именем. А если регистров с флагами 2, например. Поэтому я и поинтересовался, можно ли биты конкретного регистра как-то назвать? :)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Ответить

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