Ассемблер (ASM) для AVR в вопросах и ответах
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18675
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вы так и не поняли, в чем вам возражают. Размер данных, хранимых в любой переменной, вы можете узнать встроенными в язык средствами: либо sizeof, либо иными стандартными функциями. Поскольку в ассемблере нет понятия переменной, метка никогда это понятие не заменит, ибо никакими стандартными средствами ассемблера невозможно узнать размер данных "под этой меткой".
Метка - это алиас (псевдоним) адреса, и ничего более.
Метка - это алиас (псевдоним) адреса, и ничего более.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="shonty",url="/forum/viewtopic.php?p=3819565#p3819565"]В .dseg ставятся не метки, а резервируется пространство ОЗУ с указанием размера в байтах. Конкретного размера. И этот размер будет зарезервирован в независимости от того, будет он использоваться или нет.[/uquote]
На самом деле разницы между метками в .cseg и .dseg нет: это просто адреса памяти в удобочитамом виде. Заполнением памяти или ее распределением они не занимаются. Это делается забиванием пространства инструкциями процессора или сырыми данными (все эти .db, .dw). То есть у вас есть непрерывный поток байтов (код, данные - не важно), а метки это всего лишь метки, указатели что "вот отсюда начинается подпрограмма", "а вот отсюда - строка"
А особенность переменных в том, что работа с ними осуществляется одной операцией языка. Даже если это Си-строки, "одна операция" - это вызов функции. При этом программист обычно даже не задумывается о размере переменной или ее внутреннем представлении. Ну и бонусом часто идет встроенная проверка типов.
В ассемблере это невозможно: все инструкции работают только с регистрами, а значит и эмулировать переменные приходится на них - соответственно, надо помнить и об организации хранения, и о размере, и обо всем остальном.
На самом деле разницы между метками в .cseg и .dseg нет: это просто адреса памяти в удобочитамом виде. Заполнением памяти или ее распределением они не занимаются. Это делается забиванием пространства инструкциями процессора или сырыми данными (все эти .db, .dw). То есть у вас есть непрерывный поток байтов (код, данные - не важно), а метки это всего лишь метки, указатели что "вот отсюда начинается подпрограмма", "а вот отсюда - строка"
А особенность переменных в том, что работа с ними осуществляется одной операцией языка. Даже если это Си-строки, "одна операция" - это вызов функции. При этом программист обычно даже не задумывается о размере переменной или ее внутреннем представлении. Ну и бонусом часто идет встроенная проверка типов.
В ассемблере это невозможно: все инструкции работают только с регистрами, а значит и эмулировать переменные приходится на них - соответственно, надо помнить и об организации хранения, и о размере, и обо всем остальном.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Переменные: есть они. или нет?
Да, возможно я что-то понимаю по своему. Моё образование далеко от академического, стаж в AVRasm-е относительно скромен, а род занятий и круг общения далёк от программирования вообще. Учусь по статьям и прочей литературе.
Вот приведу в пример (авторитетный для меня) источник, статью уважаемого DI HALT-а "AVR. Учебный Курс. Работа с памятью."
Поиск в статье по "переменн" - даёт 35 результатов.
А по "variable" - 29.
--------------------
Итого: 64
"Переменная" - это иллюзорное понятие. материализованное в понимании многих программистов. Но что мешает создать эту иллюзию в ассемблере?
Вообще в качестве переменной может выступать даже гранёный стакан: сейчас в нём чай, потом кофе, молоко, вода, таракан... носки. Но его "задекларированная" ёмкость ни когда не выйдет за предел 200мл.
Всё дело в восприятии.
.DSEG
.ORG SRAM_START ;0x100
;
var: .BYTE 1
PS
А если мне не верите, то попробуйте создать пустой проект, заполнить мусором .dseg, скомпилировать в студии, и сразу увидите процент использования .dseg
В .cseg пустые метки дадут 0% заполнения.
Да, возможно я что-то понимаю по своему. Моё образование далеко от академического, стаж в AVRasm-е относительно скромен, а род занятий и круг общения далёк от программирования вообще. Учусь по статьям и прочей литературе.
Вот приведу в пример (авторитетный для меня) источник, статью уважаемого DI HALT-а "AVR. Учебный Курс. Работа с памятью."
Поиск в статье по "переменн" - даёт 35 результатов.
А по "variable" - 29.
--------------------
Итого: 64
"Переменная" - это иллюзорное понятие. материализованное в понимании многих программистов. Но что мешает создать эту иллюзию в ассемблере?
Вообще в качестве переменной может выступать даже гранёный стакан: сейчас в нём чай, потом кофе, молоко, вода, таракан... носки. Но его "задекларированная" ёмкость ни когда не выйдет за предел 200мл.
Всё дело в восприятии.
COKPOWEHEU писал(а):На самом деле разницы между метками в .cseg и .dseg нет: это просто адреса памяти в удобочитамом виде. Заполнением памяти или ее распределением они не занимаются.
.DSEG
.ORG SRAM_START ;0x100
;
var: .BYTE 1
PS
А если мне не верите, то попробуйте создать пустой проект, заполнить мусором .dseg, скомпилировать в студии, и сразу увидите процент использования .dseg
В .cseg пустые метки дадут 0% заполнения.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18675
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Создавать иллюзии никому не запрещено. Однако, речь идёт о возможностях ЯЗЫКА ПРОГРАММИРОВАНИЯ, а не об иллюзиях, создаваемых человеком.
В ассемблере НЕТ понятия ПЕРЕМЕННОЙ, как нет и инструментов для работы с ними. Это факт.
А иллюзии это именно иллюзии, т.е. обман зрения и/или ума. Обсуждать обман - смешно по определению (если вы не иллюзионист).
Добавлено after 2 minutes 9 seconds:
Кстати, большинство моих рассуждений на эту тему не опирается на какой-то программистский опыт, а наоборот, только на философию - чисто гуманитарно.
В ассемблере НЕТ понятия ПЕРЕМЕННОЙ, как нет и инструментов для работы с ними. Это факт.
А иллюзии это именно иллюзии, т.е. обман зрения и/или ума. Обсуждать обман - смешно по определению (если вы не иллюзионист).
Добавлено after 2 minutes 9 seconds:
Кстати, большинство моих рассуждений на эту тему не опирается на какой-то программистский опыт, а наоборот, только на философию - чисто гуманитарно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Starichok51
- Модератор
- Сообщения: 19055
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
shonty, регистру тоже можно присвоить имя.
и к этому именованному регистру ты тоже применить иллюзорное понятие "переменная".
но иллюзия так и останется иллюзией - переменных в ассемблере нет.
и зарезервированная область в .dseg так и останется зарезервированной областью - ни в какие переменные эта зарезервированная область не превратится.
и к этому именованному регистру ты тоже применить иллюзорное понятие "переменная".
но иллюзия так и останется иллюзией - переменных в ассемблере нет.
и зарезервированная область в .dseg так и останется зарезервированной областью - ни в какие переменные эта зарезервированная область не превратится.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Starichok51",url="/forum/viewtopic.php?p=3819620#p3819620"]shonty, регистру тоже можно присвоить имя.
и к этому именованному регистру ты тоже применить иллюзорное понятие "переменная".[/uquote]
Допустим регистр, даже не именованный, используется в роли счётчика циклов. В данном случае он выступает именно как локальная переменная.
Вообще диспут напоминает мне религиозные споры. Что бы определиться, есть переменная или нет (равно как религ. сущность), нужно дать сначала определение самой переменной.
По тем определениям, которые я привёл в цитатах выше - то они (переменные) в ассемблере есть, как локальные, так и глобальные. Но только не такие как в других рел языках.
и к этому именованному регистру ты тоже применить иллюзорное понятие "переменная".[/uquote]
Допустим регистр, даже не именованный, используется в роли счётчика циклов. В данном случае он выступает именно как локальная переменная.
Вообще диспут напоминает мне религиозные споры. Что бы определиться, есть переменная или нет (равно как религ. сущность), нужно дать сначала определение самой переменной.
По тем определениям, которые я привёл в цитатах выше - то они (переменные) в ассемблере есть, как локальные, так и глобальные. Но только не такие как в других рел языках.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="shonty",url="/forum/viewtopic.php?p=3819592#p3819592"]А если мне не верите, то попробуйте создать пустой проект, заполнить мусором .dseg, скомпилировать в студии, и сразу увидите процент использования .dseg
В .cseg пустые метки дадут 0% заполнения.[/uquote]
А теперь уберите оттуда метки и убедитесь, что объем не изменился.
Память вы заняли директивой .byte, а метка только указывает на нее.
Переменная это некая сущность языка для хранения данных определенного типа и размера, причем тип и размер одной переменной может не совпадать с другой. И язык оперирует этой абстракцией. То есть если в Си написать a+=b; то это именно сложение переменных независимо от их внутреннего представления.
А главное, абстракции не создаются просто так. Нет смысла давать специальное имя группе объектов, состоящей из одного элемента - никакого удобства это не добавит, а вот сложности будут.
Вы, конечно, можете считать, что в ассемблере есть целых 32 переменные по 1 байту каждая, но зачем? Чего вы добьетесь введением этой абстракции?
На самом деле участки памяти и метки к ним иногда действительно называют переменными. Но надо понимать, что этот термин относится к реализуемому алгоритму, а не к языку. Точно также можно в Си создать "объекты" и накрутить на них свою реализацию ООП (в gtk так и сделали, молодцы). Но от этого в самом языке классы и объекты не появятся. Или, скажем, в bash все переменные строковые. Но никто не мешает организовать целочисленный счетчик и работать с ним только при помощи специальных команд, то есть будет string->int->(вычисления)->string. С точки зрения алгоритма переменная вполне себе будет целочисленной, но для языка останется строковой.
И точно так же когда вы описываете свой алгоритм, вполне можно пользоваться алгоритмическими абстракциями вроде тех же объектов или переменных, если не будете в терминологии путаться, вас вполне поймут.
В .cseg пустые метки дадут 0% заполнения.[/uquote]
А теперь уберите оттуда метки и убедитесь, что объем не изменился.
Память вы заняли директивой .byte, а метка только указывает на нее.
Отсутствие поддержки этой иллюзии в языке.shonty писал(а):"Переменная" - это иллюзорное понятие. материализованное в понимании многих программистов. Но что мешает создать эту иллюзию в ассемблере?
Переменная это некая сущность языка для хранения данных определенного типа и размера, причем тип и размер одной переменной может не совпадать с другой. И язык оперирует этой абстракцией. То есть если в Си написать a+=b; то это именно сложение переменных независимо от их внутреннего представления.
А главное, абстракции не создаются просто так. Нет смысла давать специальное имя группе объектов, состоящей из одного элемента - никакого удобства это не добавит, а вот сложности будут.
Вы, конечно, можете считать, что в ассемблере есть целых 32 переменные по 1 байту каждая, но зачем? Чего вы добьетесь введением этой абстракции?
На самом деле участки памяти и метки к ним иногда действительно называют переменными. Но надо понимать, что этот термин относится к реализуемому алгоритму, а не к языку. Точно также можно в Си создать "объекты" и накрутить на них свою реализацию ООП (в gtk так и сделали, молодцы). Но от этого в самом языке классы и объекты не появятся. Или, скажем, в bash все переменные строковые. Но никто не мешает организовать целочисленный счетчик и работать с ним только при помощи специальных команд, то есть будет string->int->(вычисления)->string. С точки зрения алгоритма переменная вполне себе будет целочисленной, но для языка останется строковой.
И точно так же когда вы описываете свой алгоритм, вполне можно пользоваться алгоритмическими абстракциями вроде тех же объектов или переменных, если не будете в терминологии путаться, вас вполне поймут.
А чем регистр по имени temp лучше регистра по имени r16?Starichok51 писал(а):shonty, регистру тоже можно присвоить имя.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Попробовал.COKPOWEHEU писал(а):А теперь уберите оттуда метки и убедитесь, что объем не изменился.
Память вы заняли директивой .byte, а метка только указывает на нее.
Доказали
+ плюсую
Я воспринимал эту связку (метка: .byte) как неразделимую, потому и оспорил.
А чего ждать от хоббийщика.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну ежли уж о смысле...
переменная это содержимое ячейки данных с определенным именем (синонимом адреса ячейки) и заданной размерностью данных.
Для ассемблера - содержимое регистра и/или именованной ячейки - это данные, а для ЯВУ переменная - адрес и размерность области памяти, в которой находятся описываемые данные.

переменная это содержимое ячейки данных с определенным именем (синонимом адреса ячейки) и заданной размерностью данных.
Для ассемблера - содержимое регистра и/или именованной ячейки - это данные, а для ЯВУ переменная - адрес и размерность области памяти, в которой находятся описываемые данные.
- Starichok51
- Модератор
- Сообщения: 19055
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
да, r16 - это тоже имя. и меня всегда бесило, зачем в многочисленных примерах плодят эти новые имена temp, temp1 и тому подобное. логика такой замены сомнительна (для меня).COKPOWEHEU писал(а):А чем регистр по имени temp лучше регистра по имени r16?
лично у меня в проектах регистры подобного временного хранения так и остаются с собственными именами.
новые имена я присваиваю только тем регистрам, которые несут определенную функцию в программе, чтобы по имени сразу было видно, для чего регистр предназначен.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
У меня сложилась привычка давать имена только time, flags и counter.Starichok51 писал(а):новые имена я присваиваю только тем регистрам, которые несут определенную функцию в программе, чтобы по имени сразу было видно, для чего регистр предназначен.
При написании кода использую только свободный Notepad++ с гибкими настройками подсветки синтаксиса.
Можно создавать стили хоть под отдельный проект. Удобно под заготовки проектов, когда нужно эту заготовку куда-то прикрутить, а вникать что и как использовал это трата времени.
По этому подсвечиваю как имена для регистров, так и сами регистры.
Это выручает и экономит время, если добавляешь в проект дополнительный файл или заготовку кода.
Что бы долго не искать - (не)нужные регистры сразу подсветятся красным, сэкономят время и уберегут от ошибок.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18675
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Логика замены r16 на temp в бОльшем абстрагирования. Для ассемблера, как низкоуровневого языка, это кажется излишним, но это оправдано на уровне алгоритма решения задачи.
Например, при решении квадратного уравнения логичнее оперировать символьными именами "discriminant", "a", "b" и т.д., чем непривычными для алгебры r16, r18 и т.д.
Например, при решении квадратного уравнения логичнее оперировать символьными именами "discriminant", "a", "b" и т.д., чем непривычными для алгебры r16, r18 и т.д.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Не охота углубляться в дебри, но всегда считал (и считаю!) наличие переменных в Ассемблере. И не важно где они могут располагаться - в ОЗУ ли, в регистрах ли. И отсутствие sizeof не говорит об отсутствии переменных. И ассемблеры, как и архитектуры, разные. В некоторых есть команды работающие с битами, в некоторых даже с блоками - чем не массив или стринг.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Доброго времени суток!
Вопрос по работе с матричной клавиатурой. Программа выводит на св-диоды в двоичном виде номер нажатой клавиши. Кнопок 16.
У меня корректно срабатывают и выводятся значения, соответствующие 1, 2, 4, 8, 16 в двоичном виде.
При нажатии любой другой кнопки не светится ничего, точнее на мгновение загораются нужные светодиоды, но сразу же гаснут. Такое впечатление, будто в порт светодиодов следом за нужным значением выводится ноль.
Подтяжки на входах есть
В студии при отладки вроде все ок
В протеусе работает
На практике нет)
(возможно скопировать текст и вставить в новый лист в студии будет удобнее для глаз. Почему то тут текст "съезжает")
Спасибо за ответы!
Вопрос по работе с матричной клавиатурой. Программа выводит на св-диоды в двоичном виде номер нажатой клавиши. Кнопок 16.
У меня корректно срабатывают и выводятся значения, соответствующие 1, 2, 4, 8, 16 в двоичном виде.
При нажатии любой другой кнопки не светится ничего, точнее на мгновение загораются нужные светодиоды, но сразу же гаснут. Такое впечатление, будто в порт светодиодов следом за нужным значением выводится ноль.
Подтяжки на входах есть
В студии при отладки вроде все ок
В протеусе работает
На практике нет)
(возможно скопировать текст и вставить в новый лист в студии будет удобнее для глаз. Почему то тут текст "съезжает")
Спасибо за ответы!
Спойлер
Код: Выделить всё
/* МАТРИЧНАЯ КЛАВИАТУРА с выводом в порт двоичного значения (на дисплей символа) нажатой кнопкой
Программа производит считывание матричной клавиатуры.
При нажатой кнопке - выводим ее двухзначный код, иначе - выводим "0".
Матричная клавиатура состоит из 16 клавиш
МЛАДШИЕ 4 разряда порта - столбцы
СТАРШИЕ 4 разряда порта - строки
1 клавиша - на пересечении "1" и "А".
Микроконтроллер ATtiny2313
Тактовая частота 8 MHz
*/
.include "tn2313def.inc"
;НАСТРОЙКА ПОРТОВ
.def temp =R16
.def line =R17
.def column =R18
.def number =R19
.def count_delay =R20
.equ PORT_LED =PORTD
.equ PORT_SW =PORTB
.equ PIN_SW =PINB
.cseg
.org 0x00 rjmp init
;ИНИЦИАЛИЗАЦИЯ
init: ldi temp,low(RAMEND) ;Инициализация стековой памяти
out SPL,temp
ser temp
out DDRD,temp ;Порт D на выход с 0
clr temp
out PORT_LED,temp
ldi temp,0x0F ;Младшая тетрада - выход с 0
out DDRB,temp ;Старшая тетрада - вход с подтяжкой
swap temp
out PORT_SW,temp
;ОСНОВНОЙ ЦИКЛ
MAIN: rcall Keyboard
out PORT_LED,number
clr number
rjmp MAIN
Keyboard: ldi column,0b11111110 ;Обнуление первого столбеца
Next_column:rcall Ch_of_line ;Вызов подпрограммы проверки строк
brne SW_press ;Если кнопка нажата, то Z=0 (в регистре line осталось какое то число)
rol column ;Обнуление след. столбца
sbrc column,4 ;Если еще/уже не были/были обнулены все столбцы по очередно, то
rjmp Next_column ;-обнуляем следующый столбец
rjmp Keyboard ;-обнуляем снова первый столбец
SW_press: rcall delay
rcall Ch_of_line ;Считывание устойчивого состояния
breq Keyboard ;В случае ложного срабатывания (от помехи) - опрашиваем заново
mov R5,line ;Сохранение значения
rcall Ch_of_line ;Ожидание отпускания кнопки
brne PC-1 ;
rcall delay
mov line,R5
add number,line ;Загрузка в регистр number относительного адреса нажатой клавиши
lsr column ;Определение абсолютного адреса нажатой клавиши
brcc Exit_SW
subi number,-4
rjmp PC-3
Ch_of_line: out PORT_SW,column ;Обнуление выбранного столбеца
ldi line,5 ;Регистр будет сдвинут 4 раза
in temp,PIN_SW ;Считывание состояния Вывода порта SW
m1: dec line
breq Exit_SW
lsl temp ;Сдвиг регистра для определения нажатой кнопки
brcs m1
Exit_SW: ret
delay:
; ===========
; delay loop generator
; 400000 cycles:
; -----------------------------
; delaying 399999 cycles:
ldi R21, $97
WGLOOP0: ldi R22, $06
WGLOOP1: ldi R23, $92
WGLOOP2: dec R23
brne WGLOOP2
dec R22
brne WGLOOP1
dec R21
brne WGLOOP0
; -----------------------------
; delaying 1 cycle:
nop
; ===========
ret
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
1 - Даю файлы из старого проекта. Я на асме проекты уже несколько лет не пишу. Разбираетесь сами.
2 - Матричная клавиатура подключена без диодов. Пины-входы подтянуты к + питания резисторами 10 кОм. Комбинаций клавиш ограниченное количество, нужно садиться и анализировать. Либо писать тестовую программу, которая выводит состояние клавы на светодиоды, на дисплей, по интерфейсу.
3 - Цикл статей Татарчевского. По статьям будет понятен мой код.
Сначала хотел отдельные файлы выложить, решил весь проект отдать. Видео тут.
2 - Матричная клавиатура подключена без диодов. Пины-входы подтянуты к + питания резисторами 10 кОм. Комбинаций клавиш ограниченное количество, нужно садиться и анализировать. Либо писать тестовую программу, которая выводит состояние клавы на светодиоды, на дисплей, по интерфейсу.
3 - Цикл статей Татарчевского. По статьям будет понятен мой код.
Сначала хотел отдельные файлы выложить, решил весь проект отдать. Видео тут.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Starichok51",url="/forum/viewtopic.php?p=3820099#p3820099"]да, r16 - это тоже имя. и меня всегда бесило, зачем в многочисленных примерах плодят эти новые имена temp, temp1 и тому подобное.[/uquote]
Очевидно - использование именованной сущности вместо "магического числа". Другое дело, что нет смысла вводить свои магические числа вроде temp1, temp2, temp100500, да еще не соответствующие своему имени.
Очевидно - использование именованной сущности вместо "магического числа". Другое дело, что нет смысла вводить свои магические числа вроде temp1, temp2, temp100500, да еще не соответствующие своему имени.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Starichok51",url="/forum/viewtopic.php?p=3820099#p3820099"]
Переприсвоение имен для АВРки вполне оправдано.
Регистровый файл достаточно универсален и позволяет применять в отношении регистров собственную модель (единую для конкретного проекта) наиболее удобную в каждом отдельном случае.
Я обычно ставлю во фрагменте файла переопределения имен вот такой шаблон:
;таблица обьявленных имен - переназначение регистров РОН
;
; принята базовая модель:
; область ограниченного функционала
; .def mfr0 = r0 ; (математика и обмен с ПЗУ/самопрограммирование)
; .def mfr1 = r1 ; (математика и обмен с ПЗУ/самопрограммирование)
; .def = r2 ;(ограниченный функционал)
; .def = r3 ;(ограниченный функционал)
; .def = r4 ;(ограниченный функционал)
; .def = r5 ;(ограниченный функционал)
; .def = r6 ;(ограниченный функционал)
; .def = r7 ;(ограниченный функционал)
; .def = r8 ;(ограниченный функционал)
; .def = r9 ;(ограниченный функционал)
; .def = r10 ;(ограниченный функционал)
; .def = r11 ;(ограниченный функционал)
; .def = r12 ;(ограниченный функционал)
; .def = r13 ;(ограниченный функционал)
; .def = r14 ;(ограниченный функционал)
; .def = r15 ;(ограниченный функционал)
; область полного функционала
.def tmp0 = r16 ; рабочий регистр (полный функционал)
.def tmp1 = r17 ; рабочий регистр (полный функционал)
; .def = r18 ;(полный функционал)
; .def = r19 ;(полный функционал)
; .def = r20 ;(полный функционал)
; .def = r21 ;(полный функционал)
; .def = r22 ;(полный функционал)
; .def = r23 ;(полный функционал)
; .def = r24 ;("указатель базы" полный функционал)
; .def = r25 ;("указатель базы" полный функционал)
; Xl = r26 ; адрес сегмента Х (полный функционал)
; Xh = r27 ; адрес сегмента Х (полный функционал)
; Yl = r28 ; адрес сегмента Y (полный функционал)
; Yh = r29 ; адрес сегмента Y (полный функционал)
; Zl = r30 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование)
; Zh = r31 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование)
; регистры Xh:Xl, Yh:Yl, Zh:Zl определены в дефайне изготовителя и в системе команд
; изменение их имени хотя и возможно, но нежелательно -
; возникает путаница с интегрированной абревиатурой системы команд
; в случае с "малой моделью" допускающей/достаточной для размещения ВСЕХ
; используемых ВСЕМИ подпрограммами регистров в области СОЗУ регистрового
; файла одновременно (без "подкачки" наборов параметров через ОЗУ)
; рекомендовано переназначение индивидуальных имен регистров
; согласно текущей задачи
;

да, r16 - это тоже имя. и меня всегда бесило, зачем в многочисленных примерах плодят эти новые имена temp, temp1 и тому подобное. логика такой замены сомнительна (для меня)....[/uquote]COKPOWEHEU писал(а):А чем регистр по имени temp лучше регистра по имени r16?
Переприсвоение имен для АВРки вполне оправдано.
Регистровый файл достаточно универсален и позволяет применять в отношении регистров собственную модель (единую для конкретного проекта) наиболее удобную в каждом отдельном случае.
Я обычно ставлю во фрагменте файла переопределения имен вот такой шаблон:
Спойлер
;________________________;таблица обьявленных имен - переназначение регистров РОН
;
; принята базовая модель:
; область ограниченного функционала
; .def mfr0 = r0 ; (математика и обмен с ПЗУ/самопрограммирование)
; .def mfr1 = r1 ; (математика и обмен с ПЗУ/самопрограммирование)
; .def = r2 ;(ограниченный функционал)
; .def = r3 ;(ограниченный функционал)
; .def = r4 ;(ограниченный функционал)
; .def = r5 ;(ограниченный функционал)
; .def = r6 ;(ограниченный функционал)
; .def = r7 ;(ограниченный функционал)
; .def = r8 ;(ограниченный функционал)
; .def = r9 ;(ограниченный функционал)
; .def = r10 ;(ограниченный функционал)
; .def = r11 ;(ограниченный функционал)
; .def = r12 ;(ограниченный функционал)
; .def = r13 ;(ограниченный функционал)
; .def = r14 ;(ограниченный функционал)
; .def = r15 ;(ограниченный функционал)
; область полного функционала
.def tmp0 = r16 ; рабочий регистр (полный функционал)
.def tmp1 = r17 ; рабочий регистр (полный функционал)
; .def = r18 ;(полный функционал)
; .def = r19 ;(полный функционал)
; .def = r20 ;(полный функционал)
; .def = r21 ;(полный функционал)
; .def = r22 ;(полный функционал)
; .def = r23 ;(полный функционал)
; .def = r24 ;("указатель базы" полный функционал)
; .def = r25 ;("указатель базы" полный функционал)
; Xl = r26 ; адрес сегмента Х (полный функционал)
; Xh = r27 ; адрес сегмента Х (полный функционал)
; Yl = r28 ; адрес сегмента Y (полный функционал)
; Yh = r29 ; адрес сегмента Y (полный функционал)
; Zl = r30 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование)
; Zh = r31 ; адрес сегмента Z (полный функционал ПЗУ/самопрограммирование)
; регистры Xh:Xl, Yh:Yl, Zh:Zl определены в дефайне изготовителя и в системе команд
; изменение их имени хотя и возможно, но нежелательно -
; возникает путаница с интегрированной абревиатурой системы команд
; в случае с "малой моделью" допускающей/достаточной для размещения ВСЕХ
; используемых ВСЕМИ подпрограммами регистров в области СОЗУ регистрового
; файла одновременно (без "подкачки" наборов параметров через ОЗУ)
; рекомендовано переназначение индивидуальных имен регистров
; согласно текущей задачи
;
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="BOB51",url="/forum/viewtopic.php?p=3820561#p3820561"]...[/uquote]
Ерунда, а не шаблон.
1 - Написано то, что и так известно.
2 - Команда LPM более доступна, чем кажется. Уточняйте в даташитах на конкретные камни.
3 - Слишком много писанины непонятно для какой цели. Когда вы начинали, может быть это и было полезно. На нынешний момент, как минимум, касаемо команды LPM, устарела.
У меня такой вариант шаблона:
Ерунда, а не шаблон.
1 - Написано то, что и так известно.
2 - Команда LPM более доступна, чем кажется. Уточняйте в даташитах на конкретные камни.
3 - Слишком много писанины непонятно для какой цели. Когда вы начинали, может быть это и было полезно. На нынешний момент, как минимум, касаемо команды LPM, устарела.
У меня такой вариант шаблона:
Спойлер
Код: Выделить всё
//==================
//----------- List used register -----------------------------------------
// n/u - Not Used
// = r0 result multiply
// = r1 result multiply
.def RSREG = r2
.def CNT_LCD = r3
.def CNT_2 = r4
.def KEYS_PREV = r5
.def KEYS_CURRENT = r6
// = r7
// = r8
// = r9
// = r10
// = r11
// = r12
// = r13 n/u
// = r14 Used.
// = r15 Used.
//------------------------------------------------------------------------
.def TEMP = r16 // Used. Everywhere
// = r17 Used. Everywhere
// = r18 Used. Everywhere
// = r19 Used. Everywhere
.def FSM_STATE = r20
.def FSM_FLAGS = r21
.def CNT = r22
.def FLAGS = r23
// = r24 // adiw/sbiw
// = r25 // adiw/sbiw
// = r26 XL
// = r27 XH
// = r28 YL
// = r29 YH
// = r30 ZL
// = r31 ZH
//==================
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Demiurg",url="/forum/viewtopic.php?p=3820740#p3820740"][uquote="BOB51",url="/forum/viewtopic.php?p=3820561#p3820561"]...[/uquote]
Ерунда, а не шаблон....[/uquote]
LPM рассматривается как максимальный вариант - режим самопрограммирования (там ессно и по даташиту полазить придется)
Ваша Упрощенка - всего копия той же идеи как подтверждение целесообразности применения такого решения.
А заметки именно в заготовке шаблона никогда лишними не бывают.
Особо ежли не ежедневно программированием заниматься.

Ерунда, а не шаблон....[/uquote]
LPM рассматривается как максимальный вариант - режим самопрограммирования (там ессно и по даташиту полазить придется)
Ваша Упрощенка - всего копия той же идеи как подтверждение целесообразности применения такого решения.
А заметки именно в заготовке шаблона никогда лишними не бывают.
Особо ежли не ежедневно программированием заниматься.


