_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
.def может быть переопределена, а .equ - нет. Это что-то вроде дачи имен некоторому числовому значению (константе, регистру, метке..). Чисто для удобства написания кода и его ясности в дальнейшем.
_________________ Fucking static initialization order fiasco
Сейчас еще плохому поучим: Для начала, константу 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, которое и можем использовать ; и изменять столько раз, сколько хочется, вот этим самым куском кода
Ага, давайте учите! После такой записи компилятор Вас сразу покроет матом! Вы использовали одно и то же имя для метки(имени переменной) и для задания эквивалента числовому значению. И для того, чтобы воспользоваться директивой .set, располагать ее в сегменте кода не обязательно.
_________________ Fucking static initialization order fiasco
Ну, например, может быть задано значение по умолчанию, а при условной компиляции может быть переопределение при каких-либо условиях.
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
vdavid, .equ нельзя переназначить - это своего рода константа, а вот .set - всегда пожалуйста! К тому же при условной компиляции можно проинициализировать одну и ту же константу .equ разными значениями в разных ветках условного исполнения.
Код:
#ifdef true .equ xx = 1 #else .equ xx = 0 #endif
_________________ Fucking static initialization order fiasco
Последний раз редактировалось Pink-Pank Вт окт 14, 2014 21:11:31, всего редактировалось 1 раз.
Шутка - не шутка, а компилятору код понравился. Из чего вывод, если переменную с нужным значением хранить в озу, изменять ее можно. И самый простой способ - прибавление или вычитание непосредственного значения.
Да, если пользоваться другой директивой. А вы серьёзно не знали про директиву .set ?
Катэ911, компилятор уже не интересует, что вы будете делать со значением выражения после того как он, компилятор, вставил его в код.
_________________ Когда уже ничего не помогает - прочтите, наконец, инструкцию. Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII) Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
И оно работает правильно. Сначала в r16 записывается time, затем отправляется в ram, оттуда снова загружается в r16. После прибавления единицы, новое значение спокойно копируется в ram и оттуда извлекается снова в r16. В симуляторе avr студии это все наглядно показывается. Х.З. зачем нужен этот dseg, если единственное его применение - указать размер в байтах у некой переменной, которой даже значение присвоить не получается.
Этот код вызывает страшные ругательства компилятора о недопустимом переназначении переменной MyVar: Invalid redefinition of 'MyVar' Т.е. смысл вот этого
этот dseg, если единственное его применение - указать размер в байтах у некой переменной, которой даже значение присвоить не получается
Единственное его применение - разметить (распределить) рам и обозначить эту разметку текстовыми метками (туфтатавтологично), которые будет удобно читать человеческими глазами в процессе написания и отладки.
Mode: .byte 1 ; выделили один байт под конкретное применение - режим работы Buttons: .byte 1 ; выделили другой байт под тоже конкретное применение - восемь флагов, обозначающие восемь нажатых кнопок соответственно Display_buffer: .byte 32 ; выделили 32 байта под буфер дисплея - туда пишем что угодно когда угодно, оттуда дисплей рефрешим по таймеру
А почему зачем употреблено .org в .dseg, это уже сам решай. Волшебный набор волшебных символов 0x100 переводится как "число 256 в десятичном выражении".
Домашнее задание: понять, что такое "текстовая метка (text label)".
(весь трэш не читал, в плане юмора это ну так себе юморок, а голова мне ещё нужна здоровая)
Катэ911, простите, а Вы вообще давно на ассемблере пишете? Вы осознаете, что делаете строками
Код:
.set time = 0xf0 lds r16, time
? Осознаете, для чего вообще нужна директива .set? Я это спрашиваю потому, что судя из Ваших постов, Вы даже не имеете представления, каким образом происходит инициализация переменной в SRAM начальным значением.
Цитата:
И оно работает правильно.
Если компилятор не выдал ошибок при сборке проекта - это еще не значит, что код работает именно так, как Вы его задумали.
_________________ Fucking static initialization order fiasco
Последний раз редактировалось Pink-Pank Ср окт 15, 2014 14:48:56, всего редактировалось 1 раз.
To Pink-Pank: Я пишу на русском языке. А с ассемблером только начал знакомиться. И, если я вижу в атмел студии, что в регистр и в озу пишется что и куда нужно мне, то почему я должен считать что код исполняется неверно? Мне перестать верить среде разработки от этого самого производителя микроконтроллеров? SET связывает символическое имя name и его значение для микроконтроллера. Читать так удобнее будет. LDI r16, name запишет в регистр r16 значение, связанное с символическим именем name.
To nirq: Спасибо, я вполне воспринимаю как десятичную, так и бинарную, и шестнадцатеричную систему счислений.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 341
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения