реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Макросы в AVRASM/AVRASM2 и других ASM, Можно ли опираться на макро-средства ассемблеров для AVR
SAAl
сообщение Jun 30 2010, 05:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 27-10-06
Пользователь №: 21 715



Наверное уже не первый кто спрашивает но поиск не дал результатов.

Можно ли в макрокомандах имеющихся для AVR ассемблеров использовать неопределенное кол-во параметров.
Можно ли средствами макрокоманд AVRASM2 проверить переданный в макроопределение параметр по принципу есть\нет или меньше больше, если переданный параметр не константа (адрес, порт) а регистр.
Может быть уже существует реализация команды push списком push_list ZH, ZL, YL, YH, R0 и т.д.?
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Jun 30 2010, 11:01
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Насчет AVRASM2 не скажу (когда меня волновал аналогичный вопрос, его еще не было), но приличный макроязык имеется в IAR-овском ассемблере для AVR. Там это все реализуемо. Заодно и проще мешать C с ASM-ом.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jun 30 2010, 11:19
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(SAAl @ Jun 30 2010, 09:53) *
Можно ли средствами макрокоманд AVRASM2 проверить переданный в макроопределение параметр по принципу есть\нет или меньше больше, если переданный параметр не константа (адрес, порт) а регистр.

Все макросы работают на этапе компиляции/ассемблирования. Так что с не константами ничего не получится. Проверяйте внутри макроса, но эта проверка уже будет идти в рантайме и соответственно расходовать память и время.
Go to the top of the page
 
+Quote Post
SAAl
сообщение Jul 1 2010, 16:33
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 27-10-06
Пользователь №: 21 715



Цитата(Qwertty @ Jun 30 2010, 17:19) *
Все макросы работают на этапе компиляции/ассемблирования. Так что с не константами ничего не получится. Проверяйте внутри макроса, но эта проверка уже будет идти в рантайме и соответственно расходовать память и время.


В тело макросов регистры должны попадать в виде чего? Литеральные константы? Вряд ли так как при передаче в макрос они разименовываются пролетев все def-ы. Не очевидно, но регистр фактически адрес и передавать его в виде константы после разименовывания логично. r0 - 0, r1 -1 и т.д. Но при попытке проверить его макросредствами .if получаем ошибку. #if в AVRASM2 принимает, но результат сравнения не зависит от переданного параметра, что совсем уже не понятно.

Сообщение отредактировал SAAl - Jul 1 2010, 16:38
Go to the top of the page
 
+Quote Post
Deka
сообщение Jul 5 2010, 12:41
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 248
Регистрация: 18-07-06
Из: Сочи
Пользователь №: 18 890



Число параметров для одного макроса фиксированное и не может меняться динамически. Параметров всего 10, насколько я помню (от @0 до @9). Макросы с одинаковым названием не допускаются.
P.S. Давайте конкретные вопросы. Что не получается сделать?
Go to the top of the page
 
+Quote Post
SAAl
сообщение Jul 6 2010, 02:00
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 27-10-06
Пользователь №: 21 715



Цитата(Deka @ Jul 5 2010, 18:41) *
Число параметров для одного макроса фиксированное и не может меняться динамически. Параметров всего 10, насколько я помню (от @0 до @9).


Насколько я понимаю уже нет:
Цитата
The number of parameters to an assembler macro is unlimited in AVRASM2 (max 10 in AVRASM)
Что нового в AVRASM2


Цитата(Deka @ Jul 5 2010, 18:41) *
Макросы с одинаковым названием не допускаются.


Я вроде бы про это не спрашивал, или это связано с моими вопросами в первом посте?

Цитата(Deka @ Jul 5 2010, 18:41) *
P.S. Давайте конкретные вопросы. Что не получается сделать?


Конкретные вопросы я вроде бы и задал, интересует макрос push_list позволяющий "отпушить" перечисленные далее регистры, сколько бы их ни было.
Пока я решил вопрос весьма не рационально smile.gif push_list4, push_list5, push_list6 и так далее, кол-во параметров фиксировано и указывается в названии макроса.
Я бы сказал это довольно примитивное и посредственное решение. Если есть способ push_list с любым перечисленным количеством параметров было бы великолепно. Попытался двигаться к цели так - передаем максимум парметров, т.е. все 32 регистра, затем условными макросредствами или препроцессорингом пытаемся отбросить не переданные. На мой взгляд здесь есть только одна возможность проверить передан или не передан макро-параметр. Но любая попытка извлечь фактически не переданный параметр на рассмотрение в условное макросредство (.if) приводит к ошибке.

Сообщение отредактировал SAAl - Jul 6 2010, 02:19
Go to the top of the page
 
+Quote Post
adc
сообщение Jul 6 2010, 06:48
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



Дело в том что передаваемые макросу параметры строго пронумерованы, и если Вы убираете один из параметров, то нумерация остается прежней, а номера параметров сдвигаются. Из чего следует что просто убрать параметр нельзя.
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Jul 6 2010, 09:29
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



2 SAAL:
Что-то быстро найти нормальное описание avrasm2 мне не удалось sad.gif . А всю студию качать лениво.

Но вот нашел некий пример здесь:

Код
.MACRO SET_BAT
.IF @0>0x3F
.MESSAGE "Address larger than 0x3f"
lds @2, @0
sbr @2, (1<<@1)
sts @0, @2
.ELSE
.MESSAGE "Address less or equal 0x3f"
.ENDIF
.ENDMACRO


Из него видно, что, если в качестве первого параметра вводить кол-во сохраняемых регистров, то при помощи .IF можно Вашу задачу решить. А может удасться проверить наличие параметра (типа @1=пустоте или еще как), тогда вообще будет то чего изначально хотелось.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 6 2010, 12:12
Сообщение #9


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(SAAl @ Jul 1 2010, 19:33) *
#if в AVRASM2 принимает, но результат сравнения не зависит от переданного параметра, что совсем уже не понятно.
#if — это от С-шного препроцессора элементы взяты, они отрабатывают до того, как файл начинает анализировать "именно ассемблер".
avrasm2 вроде бы существенно расширяли по сравнениию с avrasm, но я на тот момент уже перестал интересоваться "родными" инструментами от Атмел, даже не смотрел.
Для поставенной задачи со списком типичный инструмент — макроинструкция IRP (блок повтора по списку аргументов). Ищите это в AVRASM2.
Для gcc-шного ассемблера это выглядит так
Код
.irp cmd, push, pop, clr
    .macro _\cmd regs : vararg
        .irp r, \regs
            \cmd \r
        .endr
    .endm
.endr
Тут первым блоком IRP генерируется три макроса — _push, _pop, _clr, каждый из которых принимает список аргументов, т.е. пишется так
Код
    _push r0, r1, r16
    _clr r0, r1
    _pop r16, r1, r0

У gcc квалификатор : vararg к аргументу макроса означает, что в него идут все "лишние" аргументы вызова макроса, в других ассемблерах это решается макроскобками. Для AVR я не пользоваля, но для 51-го у Кейла это выглядит так:
Код
_push MACRO list
    IRP dst,<list>
        push dst
    ENDM
ENDM

_pop  MACRO list
    IRP dst,<list>
        pop dst
    ENDM
ENDM
Тут уголки и есть макроскобки, которые "маскируют" разделители-запятые. Макроскобками могут быть также { }, это надо смотреть
Вызов макроса тоже со скобками
Код
    _push   <PSW,ACC,AR0>
Вот что-то подобное и надо искать у AVRASM2.

Врядли у него будет что-то похожее на красоту от AVOCET ASM51 smile.gif
Код
_push %MACRO list
        %FOR dst IN list
            push dst
        %ENDFOR
    %ENDM


Вдогонку — если ассемблер позволяет рекурсивные макросы (т.е. вызывающие сами себя), то задачу тоже можно решить, просто надо ограничиться каким-то разумным максимальным количеством аргументов. Как-то так (это тоже от 51-го контроллера, асм от 2500A.D.)

Сами себе делаем IRP с ограниченным количеством аргументов
Код
_irp .macro instr,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10
    .ifma 12
        .exit "Only 10 _irp arguments allowed"
    .endif
    instr a1
    .ifma 3
        _irp instr,a2,a3,a4,a5,a6,a7,a8,a9,a10
    .endif
.endm
И используем его в других макросах.

Код
_push .macro a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
    _irp push,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
.endm

_pop .macro a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
    _irp pop,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
.endm

_clr .macro a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
    _irp clr,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
.endm

_setb .macro a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
    _irp setb,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
.endm


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
SAAl
сообщение Jul 7 2010, 12:11
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 27-10-06
Пользователь №: 21 715



Цитата(Artem_Petrik @ Jul 6 2010, 15:29) *
2 SAAL:
Что-то быстро найти нормальное описание avrasm2 мне не удалось sad.gif . А всю студию качать лениво.


Описание из первых рук smile.gif

Цитата(Artem_Petrik @ Jul 6 2010, 15:29) *
Но вот нашел некий пример здесь:

[code].MACRO SET_BAT
.IF @0>0x3F
......
...
Из него видно, что, если в качестве первого параметра вводить кол-во сохраняемых регистров, то при помощи .IF можно Вашу задачу решить.


Получается такая штука если я передаю в макрос константу 0x3F или 0x00 - то это константа, если регистр r0..r30 или через разименовывание по def-у то это зарезервированное имя и хоть застрелись для AVRASM2 этот параметр не константа. Получается так что параметры для MACRO в AVRASM2 автоматические по типу.

Цитата(Artem_Petrik @ Jul 6 2010, 15:29) *
А может удасться проверить наличие параметра (типа @1=пустоте или еще как), тогда вообще будет то чего изначально хотелось.


ВОТ!!! И Вы тоже пришли к тому же мнению но нет проверки на пустоту не получается, точнее я не нахожу способа проверить параметр на пусто smile.gif
Go to the top of the page
 
+Quote Post
Exstreem
сообщение Jul 7 2010, 12:24
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 5-02-09
Пользователь №: 44 428



Верно, на пустоту не проверить.
Макрос в асме, как функция в С; должны быть перечислены все параметры.
Если на пустоту не проверить, то можно проверить на 0 (.if @0<>0). Конечно, при объявлении макроса будет лишняя информация, зато получишь то что хотел. rolleyes.gif

Точно не помню как обозначается "не равно" - <>, либо еще как.
Go to the top of the page
 
+Quote Post
SAAl
сообщение Jul 7 2010, 13:14
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 27-10-06
Пользователь №: 21 715



Цитата(Exstreem @ Jul 7 2010, 18:24) *
Верно, на пустоту не проверить.
Макрос в асме, как функция в С; должны быть перечислены все параметры.
Если на пустоту не проверить, то можно проверить на 0 (.if @0<>0). Конечно, при объявлении макроса будет лишняя информация, зато получишь то что хотел. rolleyes.gif

Точно не помню как обозначается "не равно" - <>, либо еще как.


если быть точным то в AVRASM2 как в Си "не равно" это "!=". Однако вот результаты, заметьте, во втором случае в передаче параметра использовалась константа и ошибка произошла уже в строке 7.

В первом случае вызов:
pushl r1, r2, r3

Цитата
AVRASM: AVR macro assembler 2.1.2 (build 99 Nov 4 2005 09:35:05)
Copyright © 1995-2005 ATMEL Corporation

asm.asm(3): error: syntax error, unexpected REGISTER
asm.asm(20): info: macro 'pushl' called here



Во втором случае вызов:
pushl 10, r2, r3

Цитата
AVRASM: AVR macro assembler 2.1.2 (build 99 Nov 4 2005 09:35:05)
Copyright © 1995-2005 ATMEL Corporation

asm.asm(7): error: syntax error, unexpected REGISTER
asm.asm(20): info: macro 'pushl' called here


Макрос выглядит так:
Код
.MACRO pushl

.if @0!=0
push @0
.endif

.if @1!=0
push @1
.endif

.if @2!=0
push @2
.endif


.ENDM


unexpected REGISTER явно свидетельствует о том что условное макросредство .if ожидает не регистр, и косвенно подтверждает что в AVRASM параметры макрокоманды типизированы на константы и регистры smile.gif


Цитата(ReAl @ Jul 6 2010, 18:12) *
#if — это от С-шного препроцессора элементы взяты, они отрабатывают до того, как файл начинает анализировать "именно ассемблер".


Да действительно при сравнении #if препроцессора происходит сравнения @0 а не то что туда передается, препроцессор тут бессмысленно применять.

Цитата(ReAl @ Jul 6 2010, 18:12) *
avrasm2 вроде бы существенно расширяли по сравнениию с avrasm, но я на тот момент уже перестал интересоваться "родными" инструментами от Атмел, даже не смотрел.


да вот так получается что расширение коснулось пару операций и внедрения препроцессора Си, остальное осталось от AVRASM.

Цитата(ReAl @ Jul 6 2010, 18:12) *
Для поставенной задачи со списком типичный инструмент — макроинструкция IRP (блок повтора по списку аргументов). Ищите это в AVRASM2.


увы... такового нет

Цитата(ReAl @ Jul 6 2010, 18:12) *
Вдогонку — если ассемблер позволяет рекурсивные макросы (т.е. вызывающие сами себя), то задачу тоже можно решить, просто надо ограничиться каким-то разумным максимальным количеством аргументов. Как-то так (это тоже от 51-го контроллера, асм от 2500A.D.)


рекурентность возможна и выход Вы нашли из положения просто "супер", но... портит все одна вещь как вывалиться из рекурсии? Только при проверке параметра, а тут такой "облом" как регистр проверить параметр не позволяет специфика условных директив.

Сообщение отредактировал SAAl - Jul 7 2010, 13:15
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Jul 7 2010, 17:51
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Цитата(SAAl @ Jul 7 2010, 15:11) *

Ну, это я видел, из этой степи и пример нарыл, но на нормальное описание оно как-то не тянет. Когда AVRASM2 только появился, я бегло просматривал его описание, и в памяти отложилось, что там наконец сделали нормальный макроязык... Похоже я ошибся smile.gif
 
Цитата(SAAl @ Jul 7 2010, 15:11) *
ВОТ!!! И Вы тоже пришли к тому же мнению но нет проверки на пустоту не получается, точнее я не нахожу способа проверить параметр на пусто smile.gif

Хорошо, пусть на пустоту не получается, а если проверить на равенство r16 например, покатит? Тогда можно извратится типа 
.IF @0=r16 or @0=r17 or @0=r18 ...  or @0=ZH
громоздко, но ведь выход smile.gif


P.S и вообще, бросайте Вы этот глючный avrasm. Есть же более достойные компиляторы. Вот например пример (каламбурим smile.gif ) из описания IAR-овского ассемблера:
Код
DO_LPM MACRO
  IF _args == 2
    LPM \1,\2
  ELSE
    LPM
  ENDIF
ENDM

Как видите количество аргументов можно проверить по IF. А если еще REPT прикрутить - вообще сказка будет.

Или вот про AVR GCC вам ReAl уже писал. Там похоже макроязык еще покруче, чем в IAR. Да еще и совесть чистая rolleyes.gif .
Пусть компилятор работает на Вас, а не Вы на компилятор  biggrin.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 7 2010, 20:11
Сообщение #14


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Artem_Petrik @ Jul 7 2010, 20:51) *
P.S и вообще, бросайте Вы этот глючный avrasm. Есть же более достойные компиляторы.
+много.
На компакте и на ftp от самого атмела более чем десятилетней давности был в комплекте бесплатный комплект от IAR — только ассемблер и линкер, версия 1.30, кажется. Как только я его обнаружил, avrasm был забыт как страшный сон.

Чей макроасм "мощнее" — IAR или gcc, мне тяжело сказать, так как IAR я не пользуюсь почти десять лет, а gcc, похоже, не использую на полную катушку, так как на асме пишу очень мало.
Ещё приятная вещь в gcc-шном макро — это атрибуты обязательности макроаргумента : req (не надо и проверять в макросе на наличие, так как сам ругнётся ещё раньше на отсутствие) и возможность задать значение аргумента по умолчанию
Код
.macro    outi    port:req, val:req, tempreg=r16
    ldi    \tempreg, \val
    out    \port, \tempreg
.endm

Код
    outi DDRB,0xFF    ; тут как временный будет r16
    outi DDRC,0xCC,r24; а тут r24




--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
SAAl
сообщение Jul 8 2010, 03:40
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 27-10-06
Пользователь №: 21 715



Цитата(Artem_Petrik @ Jul 7 2010, 23:51) *
Хорошо, пусть на пустоту не получается, а если проверить на равенство r16 например, покатит? Тогда можно извратится типа 
.IF @0=r16 or @0=r17 or @0=r18 ...  or @0=ZH
громоздко, но ведь выход smile.gif


Выход smile.gif! Но... если .if не ожидает регистр как lvalue, то даже если предположить что он допускает его в rvalue, принимать его в lvalue все равно не будет smile.gif Я проверил все тот же unexepected REGISTER.

Цитата(Artem_Petrik @ Jul 7 2010, 23:51) *
P.S и вообще, бросайте Вы этот глючный avrasm. Есть же более достойные компиляторы.


Похоже так! На месте Atmel мне со стыда гореть все это время smile.gif сделать прекрасную архитектуру и так позорно провалить в средствах разработки даже и не ЯВУ.

Цитата(Artem_Petrik @ Jul 7 2010, 23:51) *
Или вот про AVR GCC вам ReAl уже писал. Там похоже макроязык еще покруче, чем в IAR. Да еще и совесть чистая rolleyes.gif .
Пусть компилятор работает на Вас, а не Вы на компилятор  biggrin.gif


Да все верно похоже что переход на GNU-тый as закономерен, тем паче что он и свободный и мультиплатформенный. smile.gif

Цитата(ReAl @ Jul 8 2010, 02:11) *
Ещё приятная вещь в gcc-шном макро — это атрибуты обязательности макроаргумента : req (не надо и проверять в макросе на наличие, так как сам ругнётся ещё раньше на отсутствие) и возможность задать значение аргумента по умолчанию
Код
.macro    outi    port:req, val:req, tempreg=r16
    ldi    \tempreg, \val
    out    \port, \tempreg
.endm

Код
    outi DDRB,0xFF; тут как временный будет r16
    outi DDRC,0xCC,r24; а тут r24


Красиво! Фактически Вы меня убедили на раз smile.gif
Есть только одно но... А где описание добыть? В man только командная строка и опции. И учитывая что он под разные таргеты одно ли на всех описание?
Есть же какие то сущности в разных архитектурах которые на модель x86 ни как не лягут.

Сообщение отредактировал SAAl - Jul 8 2010, 03:46
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016