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

 
 
> Макросы в 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
 
Start new topic
Ответов
Qwertty
сообщение Jun 30 2010, 11:19
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
ReAl
сообщение Jul 6 2010, 12:12
Сообщение #4


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

Группа: Свой
Сообщений: 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
_Bill
сообщение Jul 11 2010, 18:11
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(ReAl @ Jul 6 2010, 16:12) *
Для 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

В IAR ассемблере делается примерно так же
Код
;
; ** STK$PUSH    -- затолкнуть в стек
;
; Описание:
;   Макрокоманда поочередно заталкивает в стек регистры из списка
; аргументов.
;   Данная макрокоманда ИЗМЕНЯЕТ значение указателя текущго уровня стека.
;
; Вызов:    STK$PUSH    <список регистров>
;
STK$PUSH    macro    list; Push register(s) on stack

        repti    rg, list
STACK$    var    STACK$+1
    st    -Y, rg
        endr
    endm    ; STK$PUSH

В данном случае используется программный стек, с Y-регистром в качестве указателя стека.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SAAl   Макросы в AVRASM/AVRASM2 и других ASM   Jun 30 2010, 05:53
- - Artem_Petrik   Насчет AVRASM2 не скажу (когда меня волновал анало...   Jun 30 2010, 11:01
- - Deka   Число параметров для одного макроса фиксированное ...   Jul 5 2010, 12:41
|- - SAAl   Цитата(Deka @ Jul 5 2010, 18:41) Число па...   Jul 6 2010, 02:00
- - adc   Дело в том что передаваемые макросу параметры стро...   Jul 6 2010, 06:48
- - Artem_Petrik   2 SAAL: Что-то быстро найти нормальное описание av...   Jul 6 2010, 09:29
|- - SAAl   Цитата(Artem_Petrik @ Jul 6 2010, 15:29) ...   Jul 7 2010, 12:11
|- - Artem_Petrik   Цитата(SAAl @ Jul 7 2010, 15:11) Описание...   Jul 7 2010, 17:51
|- - ReAl   Цитата(Artem_Petrik @ Jul 7 2010, 20:51) ...   Jul 7 2010, 20:11
|- - SAAl   Цитата(Artem_Petrik @ Jul 7 2010, 23:51) ...   Jul 8 2010, 03:40
- - Exstreem   Верно, на пустоту не проверить. Макрос в асме, как...   Jul 7 2010, 12:24
|- - SAAl   Цитата(Exstreem @ Jul 7 2010, 18:24) Верн...   Jul 7 2010, 13:14
- - Deka   Я бы тоже не отказался от помощи прикручивания к с...   Jul 8 2010, 09:54
- - Exstreem   Код ассемблировался: .MACRO Pushl .if @0<31 ...   Jul 8 2010, 14:49
- - Exstreem   В прошлом сообщении допустил ошибку: вместо Цитата...   Jul 8 2010, 18:13
|- - SAAl   Цитата(Exstreem @ Jul 9 2010, 00:13) В пр...   Jul 9 2010, 02:55
- - Exstreem   Да, конечно, пробовал, поэтому и выложил. Ассембли...   Jul 9 2010, 04:56
|- - SAAl   Цитата(Exstreem @ Jul 9 2010, 10:56) Да, ...   Jul 9 2010, 05:16
- - Exstreem   Цитатавот код который "компилится": Код ...   Jul 9 2010, 05:51
|- - SAAl   Цитата(Exstreem @ Jul 9 2010, 11:51) Ошик...   Jul 9 2010, 07:00
- - Exstreem   ЦитатаХитрость ясна, однако тоже полумера согласны...   Jul 9 2010, 07:39
- - ILYAUL   А SREG ?   Jul 10 2010, 07:13
- - Exstreem   Один из вариантов: Код.MACRO Pushl .if @0<=31 ...   Jul 10 2010, 16:29


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

 


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


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