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

Обсуждаем контроллеры компании Atmel.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Действия над переменными обеспечиваются средствами языка, как действия над неделимыми сущностями. Например, переменная типа "строка" может быть присвоена другой такой же переменной "в одно действие", будто там не 100500 символов, а один. И именно в такой "лёгкости" манипуляций над данными кроется смысл самого термина "переменная". В ассемблере в принципе нет подобных манипуляций над данными " ненативного" размера. Вот и весь сказ.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

Про 100500:
Сейчас пишу, практически написал, дело за дизайном, метеостанцию, с переписываемым/сдвигаемым графиком температуры. В ОЗУ как раз массив из 90 байт. Помимо этого есть ещё многобайтовые "переменные".
Одно дело, что их не принято называть "переменными", но по сути это одно и тоже. Тут с какого ракурса взглянуть.
Насчёт манипуляций, то конечно да, не в одну команду 90 байт передвигаю а потом вывожу на дисплей. А то что в ЯВУ это делается в одну команду - то это иллюзия, за кулисами там тоже писанины хватает. И вот тут то за упрощение часто приходится расплачиваться ресурсами.

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=3819444#p3819444"]В ассемблере это делается метками в .dseg
Но поскольку метка ничего не говорит о размере или типе данных,...[/uquote]
Ну про размер вы погорячились.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Причём тут иллюзия?! ЯВУ именно в том и заключается, что делает ассемблерную иллюзию явью! В ассемблере нет переменных, а в яву они есть, но нет ассемблера. В том и смысл!

О метках: вы знаете способ в ассемблере по метке узнать размер области памяти, которую эта метка "помечает"?

Добавлено after 2 minutes 55 seconds:
Метка в .dseg ничем для ассемблера от метки в .cseg не отличается, и даже многие equ и set запросто могут стать на место меток в командах. И как быть с их "размерами"?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="shonty",url="/forum/viewtopic.php?p=3819470#p3819470"]А то что в ЯВУ это делается в одну команду - то это иллюзия, за кулисами там тоже писанины хватает. И вот тут то за упрощение часто приходится расплачиваться ресурсами.[/uquote]
Именно этим язык более высокого уровня отличается от языка менее высокого уровня - сложностью абстракций. И чем дальше терминология языка уходит от машинной, тем выше уровень. Скажем, функций или объектов в ассемблере тоже нет. Конечно, никто не мешает их реализовать самому программисту. Правда, язык в этом помогать не будет, для доступа к локальным переменным все равно придется прокручивать адресную магию. То есть программист на ассемблере всегда работает с конкретным процессором, конкретными регистрами и адресами. А уже на С++ пользователь может даже не знать что делает оператор сложения - вдруг он для логов предназначен.
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

[uquote="ARV",url="/forum/viewtopic.php?p=3819557#p3819557"]О метках: вы знаете способ в ассемблере по метке узнать размер области памяти, которую эта метка "помечает"?[/uquote]
Вы мне что-то левое пытаетесь приписать. Речь вообще о другом шла. Предыдущий участник высказался что:
"В ассемблере это делается метками в .dseg"
В .dseg ставятся не метки, а резервируется пространство ОЗУ с указанием размера в байтах. Конкретного размера. И этот размер будет зарезервирован в независимости от того, будет он использоваться или нет.
А за все метки в коде программы я отвечать не подписывался.

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

.equ BAR_counter	= 95	; число бар по координате X
.........
.dseg
graph:	.BYTE Bar_counter	; данные графика 
Касаемо .dseg-а - 95 байт
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

И как метка связана с размером области? Никак. Что и было вам сказано, и на что вы сказали "погорячились"
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

[uquote="ARV",url="/forum/viewtopic.php?p=3819574#p3819574"]И как метка связана с размером области? Никак. Что и было вам сказано, и на что вы сказали "погорячились"[/uquote]
Речь шла не столько о метках, сколько о .dseg, а точнее использования этой области в качестве временного хранения данных.
В .dseg как раз и задаётся и размер сохраняемых данных, и согласно этого размера определена адресация последующего резервированного пространства. С .dseg-ом можно работать и без меток, а с прямой адресацией.
"погорячились" я говорил именно про .dseg а не все .equ, label, loop... etc.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Вы так и не поняли, в чем вам возражают. Размер данных, хранимых в любой переменной, вы можете узнать встроенными в язык средствами: либо sizeof, либо иными стандартными функциями. Поскольку в ассемблере нет понятия переменной, метка никогда это понятие не заменит, ибо никакими стандартными средствами ассемблера невозможно узнать размер данных "под этой меткой".
Метка - это алиас (псевдоним) адреса, и ничего более.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="shonty",url="/forum/viewtopic.php?p=3819565#p3819565"]В .dseg ставятся не метки, а резервируется пространство ОЗУ с указанием размера в байтах. Конкретного размера. И этот размер будет зарезервирован в независимости от того, будет он использоваться или нет.[/uquote]
На самом деле разницы между метками в .cseg и .dseg нет: это просто адреса памяти в удобочитамом виде. Заполнением памяти или ее распределением они не занимаются. Это делается забиванием пространства инструкциями процессора или сырыми данными (все эти .db, .dw). То есть у вас есть непрерывный поток байтов (код, данные - не важно), а метки это всего лишь метки, указатели что "вот отсюда начинается подпрограмма", "а вот отсюда - строка"
А особенность переменных в том, что работа с ними осуществляется одной операцией языка. Даже если это Си-строки, "одна операция" - это вызов функции. При этом программист обычно даже не задумывается о размере переменной или ее внутреннем представлении. Ну и бонусом часто идет встроенная проверка типов.
В ассемблере это невозможно: все инструкции работают только с регистрами, а значит и эмулировать переменные приходится на них - соответственно, надо помнить и об организации хранения, и о размере, и обо всем остальном.
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

Переменные: есть они. или нет?
Да, возможно я что-то понимаю по своему. Моё образование далеко от академического, стаж в AVRasm-е относительно скромен, а род занятий и круг общения далёк от программирования вообще. Учусь по статьям и прочей литературе.
Вот приведу в пример (авторитетный для меня) источник, статью уважаемого DI HALT-а "AVR. Учебный Курс. Работа с памятью."
Поиск в статье по "переменн" - даёт 35 результатов.
А по "variable" - 29.
--------------------
Итого: 64

"Переменная" - это иллюзорное понятие. материализованное в понимании многих программистов. Но что мешает создать эту иллюзию в ассемблере?

Вообще в качестве переменной может выступать даже гранёный стакан: сейчас в нём чай, потом кофе, молоко, вода, таракан... носки. Но его "задекларированная" ёмкость ни когда не выйдет за предел 200мл.

Всё дело в восприятии.
COKPOWEHEU писал(а):На самом деле разницы между метками в .cseg и .dseg нет: это просто адреса памяти в удобочитамом виде. Заполнением памяти или ее распределением они не занимаются.
:shock:
.DSEG
.ORG SRAM_START ;0x100
;
var: .BYTE 1

PS
А если мне не верите, то попробуйте создать пустой проект, заполнить мусором .dseg, скомпилировать в студии, и сразу увидите процент использования .dseg
В .cseg пустые метки дадут 0% заполнения.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Создавать иллюзии никому не запрещено. Однако, речь идёт о возможностях ЯЗЫКА ПРОГРАММИРОВАНИЯ, а не об иллюзиях, создаваемых человеком.

В ассемблере НЕТ понятия ПЕРЕМЕННОЙ, как нет и инструментов для работы с ними. Это факт.

А иллюзии это именно иллюзии, т.е. обман зрения и/или ума. Обсуждать обман - смешно по определению (если вы не иллюзионист).

Добавлено after 2 minutes 9 seconds:
Кстати, большинство моих рассуждений на эту тему не опирается на какой-то программистский опыт, а наоборот, только на философию - чисто гуманитарно. :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

shonty, регистру тоже можно присвоить имя.
и к этому именованному регистру ты тоже применить иллюзорное понятие "переменная".
но иллюзия так и останется иллюзией - переменных в ассемблере нет.
и зарезервированная область в .dseg так и останется зарезервированной областью - ни в какие переменные эта зарезервированная область не превратится.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3819620#p3819620"]shonty, регистру тоже можно присвоить имя.
и к этому именованному регистру ты тоже применить иллюзорное понятие "переменная".[/uquote]
Допустим регистр, даже не именованный, используется в роли счётчика циклов. В данном случае он выступает именно как локальная переменная.

Вообще диспут напоминает мне религиозные споры. Что бы определиться, есть переменная или нет (равно как религ. сущность), нужно дать сначала определение самой переменной.
По тем определениям, которые я привёл в цитатах выше - то они (переменные) в ассемблере есть, как локальные, так и глобальные. Но только не такие как в других рел языках.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

[uquote="shonty",url="/forum/viewtopic.php?p=3819592#p3819592"]А если мне не верите, то попробуйте создать пустой проект, заполнить мусором .dseg, скомпилировать в студии, и сразу увидите процент использования .dseg
В .cseg пустые метки дадут 0% заполнения.[/uquote]
А теперь уберите оттуда метки и убедитесь, что объем не изменился.
Память вы заняли директивой .byte, а метка только указывает на нее.
shonty писал(а):"Переменная" - это иллюзорное понятие. материализованное в понимании многих программистов. Но что мешает создать эту иллюзию в ассемблере?
Отсутствие поддержки этой иллюзии в языке.
Переменная это некая сущность языка для хранения данных определенного типа и размера, причем тип и размер одной переменной может не совпадать с другой. И язык оперирует этой абстракцией. То есть если в Си написать a+=b; то это именно сложение переменных независимо от их внутреннего представления.
А главное, абстракции не создаются просто так. Нет смысла давать специальное имя группе объектов, состоящей из одного элемента - никакого удобства это не добавит, а вот сложности будут.
Вы, конечно, можете считать, что в ассемблере есть целых 32 переменные по 1 байту каждая, но зачем? Чего вы добьетесь введением этой абстракции?
На самом деле участки памяти и метки к ним иногда действительно называют переменными. Но надо понимать, что этот термин относится к реализуемому алгоритму, а не к языку. Точно также можно в Си создать "объекты" и накрутить на них свою реализацию ООП (в gtk так и сделали, молодцы). Но от этого в самом языке классы и объекты не появятся. Или, скажем, в bash все переменные строковые. Но никто не мешает организовать целочисленный счетчик и работать с ним только при помощи специальных команд, то есть будет string->int->(вычисления)->string. С точки зрения алгоритма переменная вполне себе будет целочисленной, но для языка останется строковой.
И точно так же когда вы описываете свой алгоритм, вполне можно пользоваться алгоритмическими абстракциями вроде тех же объектов или переменных, если не будете в терминологии путаться, вас вполне поймут.
Starichok51 писал(а):shonty, регистру тоже можно присвоить имя.
А чем регистр по имени temp лучше регистра по имени r16?
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

COKPOWEHEU писал(а):А теперь уберите оттуда метки и убедитесь, что объем не изменился.
Память вы заняли директивой .byte, а метка только указывает на нее.
Попробовал.
Доказали :)
+ плюсую

Я воспринимал эту связку (метка: .byte) как неразделимую, потому и оспорил.
А чего ждать от хоббийщика.
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ну ежли уж о смысле...
переменная это содержимое ячейки данных с определенным именем (синонимом адреса ячейки) и заданной размерностью данных.
Для ассемблера - содержимое регистра и/или именованной ячейки - это данные, а для ЯВУ переменная - адрес и размерность области памяти, в которой находятся описываемые данные.
:roll:
:dont_know:
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

COKPOWEHEU писал(а):А чем регистр по имени temp лучше регистра по имени r16?
да, r16 - это тоже имя. и меня всегда бесило, зачем в многочисленных примерах плодят эти новые имена temp, temp1 и тому подобное. логика такой замены сомнительна (для меня).
лично у меня в проектах регистры подобного временного хранения так и остаются с собственными именами.
новые имена я присваиваю только тем регистрам, которые несут определенную функцию в программе, чтобы по имени сразу было видно, для чего регистр предназначен.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Мучитель микросхем
Аватара пользователя
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Сообщение shonty »

Starichok51 писал(а):новые имена я присваиваю только тем регистрам, которые несут определенную функцию в программе, чтобы по имени сразу было видно, для чего регистр предназначен.
У меня сложилась привычка давать имена только time, flags и counter.
При написании кода использую только свободный Notepad++ с гибкими настройками подсветки синтаксиса.
Можно создавать стили хоть под отдельный проект. Удобно под заготовки проектов, когда нужно эту заготовку куда-то прикрутить, а вникать что и как использовал это трата времени.
По этому подсвечиваю как имена для регистров, так и сами регистры.

Изображение

Это выручает и экономит время, если добавляешь в проект дополнительный файл или заготовку кода.
Что бы долго не искать - (не)нужные регистры сразу подсветятся красным, сэкономят время и уберегут от ошибок.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Логика замены r16 на temp в бОльшем абстрагирования. Для ассемблера, как низкоуровневого языка, это кажется излишним, но это оправдано на уровне алгоритма решения задачи.
Например, при решении квадратного уравнения логичнее оперировать символьными именами "discriminant", "a", "b" и т.д., чем непривычными для алгебры r16, r18 и т.д.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
OKF
Это не хвост, это антенна
Сообщения: 1452
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Не охота углубляться в дебри, но всегда считал (и считаю!) наличие переменных в Ассемблере. И не важно где они могут располагаться - в ОЗУ ли, в регистрах ли. И отсутствие sizeof не говорит об отсутствии переменных. И ассемблеры, как и архитектуры, разные. В некоторых есть команды работающие с битами, в некоторых даже с блоками - чем не массив или стринг.
Ответить

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