ASM для AVR

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Сообщение arm-17 »

здравствуйте!
В программе есть вот такая строчка.

.equ time = 0xFF


Как изменить time ну допустим где ни будь в середине программы на ASM?

типа ldi time, 0x60 только правильно)
Реклама
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

ldi r16, 0x60
sts time, r16

или косвенно через st x, st y, st z
Реклама
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Сообщение arm-17 »

спасибо
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Ужос!!! :facepalm:
arm-17, не слушай ks0, он тебя плохому сейчас научит :)
http://www.atmel.com/Images/doc1022.pdf
http://radiokot.ru/forum/download/file.php?id=108593
http://dfe.petrsu.ru/koi/posob/avrlab/avrasm-rus.htm
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

.def может быть переопределена, а .equ - нет. Это что-то вроде дачи имен некоторому числовому значению (константе, регистру, метке..). Чисто для удобства написания кода и его ясности в дальнейшем.
Fucking static initialization order fiasco
Контактная информация:
Реклама
Родился
Аватара пользователя
Сообщения: 19
Зарегистрирован: Сб окт 04, 2014 10:16:04

Сообщение Катэ911 »

Сейчас еще плохому поучим:
Для начала, константу time выкинем и заменим на переменную с нужным начальным значением

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

.CSEG
.SET time = 0x00
В озу зарезервируем для нее место, будет храниться там

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

.DSEG
.ORG SRAM_START
time: .byte 1
Делаем изменение значения переменной на новое, в нужном месте кода

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

.CSEG
lds r16, time
subi r16,(-1)  ; это нам типа нужно увеличить переменную time на единицу от ее начального значения :)) 
; хотели бы уменьшить на единицу, написали бы subi r16,1
sts time, r16  ; теперь сохраняем новое значение переменной time, которое и можем использовать
; и изменять столько раз, сколько хочется, вот этим самым куском кода
Profit!!!
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Ага, давайте учите! После такой записи компилятор Вас сразу покроет матом! Вы использовали одно и то же имя для метки(имени переменной) и для задания эквивалента числовому значению. И для того, чтобы воспользоваться директивой .set, располагать ее в сегменте кода не обязательно.
Fucking static initialization order fiasco
Контактная информация:
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

А для чего может понадобиться изменение значения литерала? Это ведь противоречит самой его сути.
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Ну, например, может быть задано значение по умолчанию, а при условной компиляции может быть переопределение при каких-либо условиях.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Родился
Аватара пользователя
Сообщения: 19
Зарегистрирован: Сб окт 04, 2014 10:16:04

Сообщение Катэ911 »

Пошутить нельзя... :)))

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

.DSEG
.ORG SRAM_START
.SET time = 0x00
.CSEG
lds r16, time
subi r16,(-1)
sts time, r16
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

Kavka, Вы серьезно?

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

	.equ	time=1
	.equ	time=2
a.asm(2) : error : Symbol is already defined by the .EQU directive :))
Догадайтесь почему.
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Катэ911, опять шутите? Ай, Вы какой веселый! :tea:

vdavid, .equ нельзя переназначить - это своего рода константа, а вот .set - всегда пожалуйста! К тому же при условной компиляции можно проинициализировать одну и ту же константу .equ разными значениями в разных ветках условного исполнения. ;)

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

#ifdef true
.equ xx = 1
#else 
.equ xx = 0
#endif
Последний раз редактировалось Pink-Pank Вт окт 14, 2014 21:11:31, всего редактировалось 1 раз.
Fucking static initialization order fiasco
Контактная информация:
Родился
Аватара пользователя
Сообщения: 19
Зарегистрирован: Сб окт 04, 2014 10:16:04

Сообщение Катэ911 »

Шутка - не шутка, а компилятору код понравился.
Из чего вывод, если переменную с нужным значением хранить в озу, изменять ее можно. И самый простой способ - прибавление или вычитание непосредственного значения.
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

А Вы уверены, что в своем коде Вы работаете с переменной из SRAM, а не с регистром r0? 8)
Fucking static initialization order fiasco
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

vdavid писал(а):Kavka, Вы серьезно?
Да, если пользоваться другой директивой. А вы серьёзно не знали про директиву .set ?

Катэ911, компилятор уже не интересует, что вы будете делать со значением выражения после того как он, компилятор, вставил его в код. :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

Сообщение vdavid »

Катэ911, А теперь, внимание, вопрос.
Что изменится, если выбросить это?

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

.DSEG
.ORG SRAM_START
Kavka, Простите, но вопрос был про именно .equ
Родился
Аватара пользователя
Сообщения: 19
Зарегистрирован: Сб окт 04, 2014 10:16:04

Сообщение Катэ911 »

To vdavid
Ничего не меняется, если в программе .DSEG вообще не указывать. Пробовал даже так:

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

.set time = 0xf0
ldi r16, time
sts 0x100, r16
ldi r16, 0x00
lds r16, 0x100
subi r16,(-1)
sts 0x100, r16
ldi r16, 0x00
lds r16, 0x100
И оно работает правильно. Сначала в r16 записывается time, затем отправляется в ram, оттуда снова загружается в r16. После прибавления единицы, новое значение спокойно копируется в ram и оттуда извлекается снова в r16. В симуляторе avr студии это все наглядно показывается.
Х.З. зачем нужен этот dseg, если единственное его применение - указать размер в байтах у некой переменной, которой даже значение присвоить не получается.

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

.DSEG
.ORG 0x100
MyVar: .BYTE 2
.CSEG
.set MyVar = 0xABCD
Этот код вызывает страшные ругательства компилятора о недопустимом переназначении переменной MyVar:
Invalid redefinition of 'MyVar'
Т.е. смысл вот этого

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

MyVar: .BYTE 2
отсутствует начисто.
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Сообщение nirq »

этот dseg, если единственное его применение - указать размер в байтах у некой переменной, которой даже значение присвоить не получается
Единственное его применение - разметить (распределить) рам и обозначить эту разметку текстовыми метками (туфтатавтологично), которые будет удобно читать человеческими глазами в процессе написания и отладки.

Mode: .byte 1 ; выделили один байт под конкретное применение - режим работы
Buttons: .byte 1 ; выделили другой байт под тоже конкретное применение - восемь флагов, обозначающие восемь нажатых кнопок соответственно
Display_buffer: .byte 32 ; выделили 32 байта под буфер дисплея - туда пишем что угодно когда угодно, оттуда дисплей рефрешим по таймеру

А почему зачем употреблено .org в .dseg, это уже сам решай.
Волшебный набор волшебных символов 0x100 переводится как "число 256 в десятичном выражении".

Домашнее задание: понять, что такое "текстовая метка (text label)".



(весь трэш не читал, в плане юмора это ну так себе юморок, а голова мне ещё нужна здоровая)
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Катэ911, простите, а Вы вообще давно на ассемблере пишете? Вы осознаете, что делаете строками

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

.set time = 0xf0
lds r16, time
?
Осознаете, для чего вообще нужна директива .set?
Я это спрашиваю потому, что судя из Ваших постов, Вы даже не имеете представления, каким образом происходит инициализация переменной в SRAM начальным значением.
И оно работает правильно.
Если компилятор не выдал ошибок при сборке проекта - это еще не значит, что код работает именно так, как Вы его задумали. ;)
Последний раз редактировалось Pink-Pank Ср окт 15, 2014 14:48:56, всего редактировалось 1 раз.
Fucking static initialization order fiasco
Контактная информация:
Родился
Аватара пользователя
Сообщения: 19
Зарегистрирован: Сб окт 04, 2014 10:16:04

Сообщение Катэ911 »

To Pink-Pank:
Я пишу на русском языке. А с ассемблером только начал знакомиться. И, если я вижу в атмел студии, что в регистр и в озу пишется что и куда нужно мне, то почему я должен считать что код исполняется неверно? Мне перестать верить среде разработки от этого самого производителя микроконтроллеров?
SET связывает символическое имя name и его значение для микроконтроллера. Читать так удобнее будет.
LDI r16, name запишет в регистр r16 значение, связанное с символическим именем name.

To nirq:
Спасибо, я вполне воспринимаю как десятичную, так и бинарную, и шестнадцатеричную систему счислений.
Ответить

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