|
Макросы в AVRASM/AVRASM2 и других ASM, Можно ли опираться на макро-средства ассемблеров для AVR |
|
|
|
Jul 8 2010, 14:49
|
Участник

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

|
Код ассемблировался: .MACRO Pushl .if @0<31 push R@0 .endif .if @1<31 push R@1 .endif .ENDMACRO Думаю вопросов не возникнет
|
|
|
|
|
Jul 8 2010, 18:13
|
Участник

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

Группа: Участник
Сообщений: 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 А Вы вызвать макрос попробовали?  К сожалению все та же ошибка с неожиданны регистром: Цитата 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
|
|
|
|
|
Jul 9 2010, 04:56
|
Участник

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

|
Да, конечно, пробовал, поэтому и выложил. Ассемблировал в CVAVR, ошибок не выдает.
|
|
|
|
|
Jul 9 2010, 05:16
|
Участник

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

Группа: Участник
Сообщений: 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 не будет выполняться (будет пропущен).
|
|
|
|
|
Jul 9 2010, 07:00
|
Участник

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

|
Цитата(Exstreem @ Jul 9 2010, 11:51)  Ошика в Pushl R0, R1. ............... Числа могут быть от 0 до 31 (по количеству регистров). Если будет более 32, то push не будет выполняться (будет пропущен).  Ах вот оно в чем дело! А я то сообразить не мог почему push R@0, а оно вон оно как. Хитрость ясна, однако тоже полумера согласны?
|
|
|
|
|
Jul 9 2010, 07:39
|
Участник

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

|
Цитата Хитрость ясна, однако тоже полумера согласны? Так-то оно так. Наверно, учат смекалку проявлять
|
|
|
|
|
Jul 10 2010, 16:29
|
Участник

Группа: Участник
Сообщений: 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).
|
|
|
|
|
Jul 11 2010, 18:11
|
Местный
  
Группа: Участник
Сообщений: 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  Код _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-регистром в качестве указателя стека.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|