Страница 1 из 2
ASM для AVR
Добавлено: Пн окт 13, 2014 18:31:54
arm-17
здравствуйте!
В программе есть вот такая строчка.
.equ time = 0xFF
Как изменить time ну допустим где ни будь в середине программы на ASM?
типа ldi time, 0x60 только правильно)
Re: ASM для AVR
Добавлено: Пн окт 13, 2014 18:40:07
ks0
ldi r16, 0x60
sts time, r16
или косвенно через st x, st y, st z
Re: ASM для AVR
Добавлено: Пн окт 13, 2014 18:49:11
arm-17
спасибо
Re: ASM для AVR
Добавлено: Пн окт 13, 2014 21:01:45
Kavka
Re: ASM для AVR
Добавлено: Пн окт 13, 2014 21:58:02
Pink-Pank
.def может быть переопределена, а .equ - нет. Это что-то вроде дачи имен некоторому числовому значению (константе, регистру, метке..). Чисто для удобства написания кода и его ясности в дальнейшем.
Re: ASM для AVR
Добавлено: Пн окт 13, 2014 22:21:59
Катэ911
Сейчас еще плохому поучим:
Для начала, константу time выкинем и заменим на переменную с нужным начальным значением
В озу зарезервируем для нее место, будет храниться там
Делаем изменение значения переменной на новое, в нужном месте кода
Код: Выделить всё
.CSEG
lds r16, time
subi r16,(-1) ; это нам типа нужно увеличить переменную time на единицу от ее начального значения :))
; хотели бы уменьшить на единицу, написали бы subi r16,1
sts time, r16 ; теперь сохраняем новое значение переменной time, которое и можем использовать
; и изменять столько раз, сколько хочется, вот этим самым куском кода
Profit!!!
Re: ASM для AVR
Добавлено: Вт окт 14, 2014 07:08:41
Pink-Pank
Ага, давайте учите! После такой записи компилятор Вас сразу покроет матом! Вы использовали одно и то же имя для метки(имени переменной) и для задания эквивалента числовому значению. И для того, чтобы воспользоваться директивой .set, располагать ее в сегменте кода не обязательно.
Re: ASM для AVR
Добавлено: Вт окт 14, 2014 08:30:45
vdavid
А для чего может понадобиться изменение значения литерала? Это ведь противоречит самой его сути.
Re: ASM для AVR
Добавлено: Вт окт 14, 2014 10:48:06
Kavka
Ну, например, может быть задано значение по умолчанию, а при условной компиляции может быть переопределение при каких-либо условиях.
Re: ASM для AVR
Добавлено: Вт окт 14, 2014 18:56:34
Катэ911
Пошутить нельзя...
Код: Выделить всё
.DSEG
.ORG SRAM_START
.SET time = 0x00
.CSEG
lds r16, time
subi r16,(-1)
sts time, r16
Re: ASM для AVR
Добавлено: Вт окт 14, 2014 20:34:35
vdavid
Kavka, Вы серьезно?
a.asm(2) : error : Symbol is already defined by the .EQU directive
Догадайтесь почему.
Re: ASM для AVR
Добавлено: Вт окт 14, 2014 20:35:31
Pink-Pank
Катэ911, опять шутите? Ай, Вы какой веселый!
vdavid,
.equ нельзя переназначить - это своего рода константа, а вот
.set - всегда пожалуйста! К тому же при условной компиляции можно проинициализировать одну и ту же константу
.equ разными значениями в разных ветках условного исполнения.
Код: Выделить всё
#ifdef true
.equ xx = 1
#else
.equ xx = 0
#endif
Re: ASM для AVR
Добавлено: Вт окт 14, 2014 20:53:24
Катэ911
Шутка - не шутка, а компилятору код понравился.
Из чего вывод, если переменную с нужным значением хранить в озу, изменять ее можно. И самый простой способ - прибавление или вычитание непосредственного значения.
Re: ASM для AVR
Добавлено: Вт окт 14, 2014 20:55:38
Pink-Pank
А Вы уверены, что в своем коде Вы работаете с переменной из SRAM, а не с регистром r0?

Re: ASM для AVR
Добавлено: Вт окт 14, 2014 20:56:06
Kavka
vdavid писал(а):Kavka, Вы серьезно?
Да, если пользоваться другой директивой. А вы серьёзно не знали про директиву .set ?
Катэ911, компилятор уже не интересует, что вы будете делать со значением выражения после того как он, компилятор, вставил его в код.

Re: ASM для AVR
Добавлено: Вт окт 14, 2014 20:59:06
vdavid
Катэ911, А теперь, внимание, вопрос.
Что изменится, если выбросить это?
Kavka, Простите, но вопрос был про именно .equ
Re: ASM для AVR
Добавлено: Ср окт 15, 2014 00:52:01
Катэ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'
Т.е. смысл вот этого
отсутствует начисто.
Re: ASM для AVR
Добавлено: Ср окт 15, 2014 05:43:47
nirq
этот dseg, если единственное его применение - указать размер в байтах у некой переменной, которой даже значение присвоить не получается
Единственное его применение - разметить (распределить) рам и обозначить эту разметку текстовыми метками (
туфтатавтологично), которые будет удобно читать человеческими глазами в процессе написания и отладки.
Mode: .byte 1 ; выделили один байт под конкретное применение - режим работы
Buttons: .byte 1 ; выделили другой байт под тоже конкретное применение - восемь флагов, обозначающие восемь нажатых кнопок соответственно
Display_buffer: .byte 32 ; выделили 32 байта под буфер дисплея - туда пишем что угодно когда угодно, оттуда дисплей рефрешим по таймеру
А почему зачем употреблено .org в .dseg, это уже сам решай.
Волшебный набор волшебных символов 0x100 переводится как "число 256 в десятичном выражении".
Домашнее задание: понять, что такое "текстовая метка (text label)".
(весь трэш не читал, в плане юмора это ну так себе юморок, а голова мне ещё нужна здоровая)
Re: ASM для AVR
Добавлено: Ср окт 15, 2014 07:04:47
Pink-Pank
Катэ911, простите, а Вы вообще давно на ассемблере пишете? Вы осознаете, что делаете строками
?
Осознаете, для чего вообще нужна директива .set?
Я это спрашиваю потому, что судя из Ваших постов, Вы даже не имеете представления, каким образом происходит инициализация переменной в SRAM начальным значением.
И оно работает правильно.
Если компилятор не выдал ошибок при сборке проекта - это еще не значит, что код работает именно так, как Вы его задумали.

Re: ASM для AVR
Добавлено: Ср окт 15, 2014 13:48:27
Катэ911
To Pink-Pank:
Я пишу на русском языке. А с ассемблером только начал знакомиться. И, если я вижу в атмел студии, что в регистр и в озу пишется что и куда нужно мне, то почему я должен считать что код исполняется неверно? Мне перестать верить среде разработки от этого самого производителя микроконтроллеров?
SET связывает символическое имя name и его значение для микроконтроллера. Читать так удобнее будет.
LDI r16, name запишет в регистр r16 значение, связанное с символическим именем name.
To nirq:
Спасибо, я вполне воспринимаю как десятичную, так и бинарную, и шестнадцатеричную систему счислений.