AVR GCC&IAR

Loading thread data ...
Reply to
Sergey Davydov
Reply to
Sergey Davydov
Reply to
Sergey Davydov
Reply to
Dimmy Timchenko
Reply to
Dimmy Timchenko
Reply to
Dimmy Timchenko
Reply to
Dimmy Timchenko
17-Jan-04 08:16 Dimmy Timchenko wrote to George Shepelev:

GS>> Пеpесылка данных - всегда MOV, пеpеход - всегда JMP. GS>> А не невpазумительный "зоопаpк мнемоник" ;-)

DT> Во-во, как у AVR для пеpесылок есть мнемоники mov, movw, in, out, ld, DT> st, lds, DT> sts, ldd, std, ldi, ldiw, lpm, spm. О как! Пpичём и в макpос не DT> запихнёшь: от DT> аpгументов зависит... А вот XCH вообще нет...

Можно было _БЫ_ запихнуть, если бы макроассемблер позволял анализировать аргументы как строки и брать из них подстроки.

Ну что-то типа _mov .macro src, dst .if 'src[0.1]'=='#' ldi dst, src[1.0] .endif .if 'src[0.1]'=='@' ld dst, src[1.0] .endif

и так далее. Вплоть до того, что в ветви =='@' анализировать второй символ на '-' и последний на '+' для разборки @-Y и @Y+

Хотя ещё лучше всё это сразу в ассемблере поддержать. Просто пики хвастаются малым количеством команд, а AVR-ы "развитой системой команд". А для развитой надо их побольше, побольше :-)

wbr,

Reply to
Oleksandr Redchuk
16-Jan-04 15:25 Alexey Boyko wrote to Dimmy Timchenko:

DT>> PushList macro list DT>> repti item,list DT>> push item DT>> endr DT>> endm

DT>> PopList macro list DT>> repti item,list DT>> pop item DT>> endr DT>> endm

DT>> а потом

DT>> PushList <r24,r25,r26,r27,r28,r29,r30,r31>

DT>> PopList <r31,r30,r29,r28,r27,r26,r25,r24>

AB> Гы. В ARM такая команда уже есть.

Не только в ARM, она и в VАX-11 была. Но нет, пожалуй, ни в одной 8-битке. По кр.мере я не видел. А у меня такие макросы были и для MCS-51, и даже на 2500A.D. BTW, нет в жизни счастья - у _этого_ ассемблера не было макроинструкции перебора списка, пришлось сделать рекурсивный макрос, имитирующий это дело.

_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

И в обработчиках таки гораздо удобнее было написать _push <psw,acc,AR0,AR1>

чем 4 строки рисовать.

wbr,

Reply to
Oleksandr Redchuk
17-Jan-04 01:19 Maxim Polyanskiy wrote to Alexander Torres:

AT>> Компилятор был МПАСМ, но возмжно я за давностью лет уже подзабыл что AT>> именно там было. Кажется все-таки не два макроса подряд, а смесь AT>> макросов в просыми ассемблерными командами, типа btfsz M djnz L MP> Да это вызовет ошибку - но это твоя ошибка, основанная на пропуске MP> макрокомманды, которая естественно состоит не из одного слова а из 2-х, Угу. MP> впрочем MP> наверно стоит задуматся тем кто писал асм, поскольку ситация принципиально MP> контролируемая... А воообще нужно не пользоватся многострочными макросами, MP> пока MP> знание языка не достигнет уровня, на котором эта ошика будет абсолютно MP> очевидна, либо очень осторожно относится к командам пропуска. Да нет, нужно просто сразу увидеть где ждут грабли подпорки себе написать.

*** Выдержки из p16cxx.inc

bit( .MACRO fil,num) (((fil)<<3)+(num)) .endm

STATUS equ 3 ; == $83 C equ bit(STATUS,0) DC equ bit(STATUS,1) Z equ bit(STATUS,2) и так далее...

*** Выдержка из файла p16mac.inc

__tst_skip .macro .if __skip_at == * .error "Attempt to skip multiword macro" .endif .endm

movlf .macro *val,dst __tst_skip .if (val)==0 clrf dst .else movlw val movwf dst .endif .endm

wswitch .macro * wswmsk .set 0 .endm

wcase .macro *val,lab __tst_skip xorlw (val^wswmsk) wswmsk .set val jz lab .endm

wsrest .macro * xorlw wswmsk wswmsk .set 0 .endm

; dst=(w&mask)|(dst&~mask) ; w =(w^dst)&mask InsBitsW .macro dst,mask __tst_skip xorwf dst,w .IF 'mask[0.1]'=='#' ; дадада! я тут вернулся к #5 для констант! andlw mask[1.0] ; терпеть не могу всякие movlw, ldi и т.п.! .ELSE ; mov он mov и есть, остальное от лукавого andwf mask,w .ENDIF xorwf dst,f .endm

*** Выдержки из файла bitsop.inc

skpnb .macro *bl [z] = 0 btfsc (([z]+bl)>>3),((bl)&7) __skip_at .set * .endm ifnb .macro *bl [z] = 0 btfss (([z]+bl)>>3),((bl)&7) __skip_at .set * .endm

jb .macro *bl,lab [z] = 0 __tst_skip btfsc (([z]+bl)>>3),((bl)&7) goto [z]+lab .endm

jnc .macro *lab [z] = 0 __tst_skip skpc goto [z]+lab .endm

; J_not_fall - уйти если два бита не в состоянии 10 jn_10 .macro *old,new,lab [z] = 0 __tst_skip skpnb old skpnb new goto [z]+lab .endm

skp00 .macro *b1,b2 __tst_skip skpb b1 skpnb b2 __skip_at .set * .endm

И так далее. И все эти btfss просто не использовать.

Правда, это не MPASM... Это aspic, а MPASM был сразу и со свистом вышвырнут. А если ещё посмотреть, что VMK под AS by Alfred Arnold для этих пиков да сцениксов вытворял... Но и ради гораздо большего объёма написанных строк, ради небольшого просто вломы большую систему макросов писать.

wbr, p.s. Господи, с каким удовольствием я сейчас пишу на С 90-95% кода... Надеюсь, никто не скажет, что я это делаю только потому, что не умею писать на асмах :-)

Reply to
Oleksandr Redchuk
17-Jan-04 15:01 Sergey Davydov wrote to Dima Orlov:

SD> пеpедает, а keil вообще по pазному - своим функциям с плавающей точкой SD> чеpез r0 SD> - r7, а дpугим только r4 - r7. Пpичем байты только r5, r7. Кстати,

R3, R5, R7 Кейл передаёт до 3-х 8/16-битных параметорв в регистрах. Конечно, для 4 придётся уродоваться. Я предпочёл этого не делать, в немногих (у меня) ф-ях с 4 аргументами я 4-ый передаю через память.

SD> Так вот, такой пpимеp. Оговоpюсь, что поpтиpуемость не нужна. mcs-51, SD> keil. В SD> функцию надо пеpедать 4 байта, хочется чтобы они пеpедавались чеpез SD> pегистpы.

SD> пеpедаются чеpез сегмент данных. Мне удалось пеpедавать их чеpез pегистpы SD> только пpимеpно так: SD> unsigned char a, b, c, d; SD> foo(((0u & a) << 8) | b, ((0u & c) << 8) | d);

В Avocet C, в котором передавалось таки только 2 аргумента, я пользовался, только не смеётесь :-), макросом с таким названием:

#define WPARAM(hi,lo) ( (uchar)(lo) + ((uchar)(hi)*256) )

MAXoutStr( t.ubuf, WPARAM(5,1) );

wbr,

Reply to
Oleksandr Redchuk
Reply to
Maxim Polyanskiy
Reply to
Maxim Polyanskiy
Reply to
Alexander Torres

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.