- Vote on answer
- posted
20 years ago
AVR GCC&IAR
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
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,
- Vote on answer
- posted
20 years ago
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,
- Vote on answer
- posted
20 years ago
AT>> Компилятор был МПАСМ, но возмжно я за давностью лет уже подзабыл что AT>> именно там было. Кажется все-таки не два макроса подряд, а смесь AT>> макросов в просыми ассемблерными командами, типа btfsz M djnz L MP> Да это вызовет ошибку - но это твоя ошибка, основанная на пропуске MP> макрокомманды, которая естественно состоит не из одного слова а из 2-х, Угу. MP> впрочем MP> наверно стоит задуматся тем кто писал асм, поскольку ситация принципиально MP> контролируемая... А воообще нужно не пользоватся многострочными макросами, MP> пока MP> знание языка не достигнет уровня, на котором эта ошика будет абсолютно MP> очевидна, либо очень осторожно относится к командам пропуска. Да нет, нужно просто сразу увидеть где ждут грабли подпорки себе написать.
*** Выдержки из p16cxx.incbit( .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.incskpnb .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% кода... Надеюсь, никто не скажет, что я это делаю только потому, что не умею писать на асмах :-)
- Vote on answer
- posted
20 years ago
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,
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago
- Vote on answer
- posted
20 years ago