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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Макросы в AVRASM/AVRASM2 и других ASM, Можно ли опираться на макро-средства ассемблеров для AVR
Deka
сообщение Jul 8 2010, 09:54
Сообщение #16


Местный
***

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



Я бы тоже не отказался от помощи прикручивания к студии другого ассемблера. Хоть от ИАР хоть гнутого...
Go to the top of the page
 
+Quote Post
Exstreem
сообщение Jul 8 2010, 14:49
Сообщение #17


Участник
*

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



Код ассемблировался:
.MACRO Pushl
.if @0<31
push R@0
.endif
.if @1<31
push R@1
.endif
.ENDMACRO
Думаю вопросов не возникнет rolleyes.gif
Go to the top of the page
 
+Quote Post
Exstreem
сообщение Jul 8 2010, 18:13
Сообщение #18


Участник
*

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



В прошлом сообщении допустил ошибку:
вместо
Цитата
.if @0<31

надо
Код
.if @0<=31

и получается
Код
.MACRO Pushl
.if @0<=31
   push R@0
.endif
.if @1<=31
   push R@1
.endif
.ENDMACRO


Сообщение отредактировал Exstreem - Jul 8 2010, 18:16
Go to the top of the page
 
+Quote Post
SAAl
сообщение Jul 9 2010, 02:55
Сообщение #19


Участник
*

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



Цитата(Exstreem @ Jul 9 2010, 00:13) *
В прошлом сообщении допустил ошибку:
вместо

надо
Код
.if @0<=31

и получается
Код
.MACRO Pushl
.if @0<=31
   push R@0
.endif
.if @1<=31
   push R@1
.endif
.ENDMACRO


А Вы вызвать макрос попробовали? smile.gif К сожалению все та же ошибка с неожиданны регистром:
Цитата
AVRASM: AVR macro assembler 2.1.41 (build 1792 Jul 21 2009 12:30:27)
Copyright © 1995-2009 ATMEL Corporation

example.asm(2): error: syntax error, unexpected REGISTER
example.asm(10): info: macro 'Pushl' called here

Assembly failed, 1 errors, 0 warnings


Сообщение отредактировал SAAl - Jul 9 2010, 02:56
Go to the top of the page
 
+Quote Post
Exstreem
сообщение Jul 9 2010, 04:56
Сообщение #20


Участник
*

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



Да, конечно, пробовал, поэтому и выложил.
Ассемблировал в CVAVR, ошибок не выдает.
Go to the top of the page
 
+Quote Post
SAAl
сообщение Jul 9 2010, 05:16
Сообщение #21


Участник
*

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



Цитата(Exstreem @ Jul 9 2010, 10:56) *
Да, конечно, пробовал, поэтому и выложил.
Ассемблировал в CVAVR, ошибок не выдает.



Выкачал CVAVR Evalution там avrasm2 гораздо более поздней версии однако "компилится" точно с такой же ошибкой:

вот выхлоп AVRASM2 из CVAVR:
Цитата
AVRASM: AVR macro assembler 2.1.30 (build 592 Nov 7 2008 12:38:17)
Copyright © 1995-2008 ATMEL Corporation

example.asm(2): error: syntax error, unexpected REGISTER
example.asm(10): info: macro 'Pushl' called here

Assembly failed, 1 errors, 0 warnings


вот код который "компилится":
Код
.MACRO Pushl
.if @0<=31
   push R@0
.endif
.if @1<=31
   push R@1
.endif
.ENDM

Pushl   R0, R1


Go to the top of the page
 
+Quote Post
Exstreem
сообщение Jul 9 2010, 05:51
Сообщение #22


Участник
*

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



Цитата
вот код который "компилится":
Код
.MACRO Pushl
.if @0<=31
push R@0
.endif
.if @1<=31
push R@1
.endif
.ENDM

Pushl R0, R1

Ошика в Pushl R0, R1. В push мы передаем R@0, R уже присутсвует, поэтому
вызов макроса д.б.
Код
Pushl 0, 1

Числа могут быть от 0 до 31 (по количеству регистров). Если будет более 32, то push не будет выполняться (будет пропущен). smile.gif
Go to the top of the page
 
+Quote Post
SAAl
сообщение Jul 9 2010, 07:00
Сообщение #23


Участник
*

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



Цитата(Exstreem @ Jul 9 2010, 11:51) *
Ошика в Pushl R0, R1.
...............
Числа могут быть от 0 до 31 (по количеству регистров). Если будет более 32, то push не будет выполняться (будет пропущен). smile.gif


Ах вот оно в чем дело! А я то сообразить не мог почему push R@0, а оно вон оно как. Хитрость ясна, однако тоже полумера согласны?
Go to the top of the page
 
+Quote Post
Exstreem
сообщение Jul 9 2010, 07:39
Сообщение #24


Участник
*

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



Цитата
Хитрость ясна, однако тоже полумера согласны?

Так-то оно так. Наверно, учат смекалку проявлять biggrin.gif
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 10 2010, 07:13
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



А SREG ?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Exstreem
сообщение Jul 10 2010, 16:29
Сообщение #26


Участник
*

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



Один из вариантов:
Код
.MACRO Pushl
.if @0<=31
push R@0
in R@0, SREG
push R@0
.endif

Т.к. в любом случае один из регистов будешь сохранять, то в первом можно реализовать сохранение SREG.
Т.о. можно сохранять (@x<=31), либо не сохранять SREG (@x>=32).
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 11 2010, 18:11
Сообщение #27


Местный
***

Группа: Участник
Сообщений: 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

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

 


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


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