ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
18 мая
52660 Топик полностью
ReAl (01.03.2006 23:41, просмотров: 1) ответил MDenis на Ну да, тут не поспоришь... :(
Ещё примеры. Смотрел я как-то исходники под кейл-51, на ассемблере. Нужны там были unicode-строки. Да просто по числу нажатий клавиш быстрее написать <pre> unicodestr MACRO str IRPC ch, <str> DB 'ch', 0 ENDM DB 0, 0 ENDM unicodestr "Супер-пупер USB дивайс" </pre> чем ручками DB 'C',0,'у',0 и так далее. Я уже не говорю о сопровождаемости. Я просто не понимаю, зачем писать push PSW push ACC и так далее в столбик, если можно <pre> _push MACRO list IRP dst,<list> push dst ENDM ENDM _pop MACRO list IRP dst,<list> pop dst ENDM ENDM _push <PSW,ACC,AR0,AR1> ... _pop <AR1,AR0,ACC,PSW> </pre> Чем ёмче строка, тем легче писать и потом дописывать. "При кейле" я уже для 51-ых писал в основнмо на С, на асме только куски "низа" - критичные по скорости, иногда - и ради размера. Но тем не менее такого рода макросы были: <pre> stos MACRO adr,src IF not nul src mov @adr,src ELSE mov @adr,a ENDIF inc adr ENDM lods MACRO adr,dst ;; R,@R IF not nul dst mov dst,@adr ELSE mov a,@adr ENDIF inc adr ENDM stos R0, #5 stos R0 stos R0, var </pre> Ну а раньше я использовал AVOCET-овский асм, так там даже до такого доходило: <pre> .shift MACRO op,dst,num ;; left bit C as dst.(num-1) IFNE <dst>,<a> xch a,dst ENDIF IFB <num> &op a ELSE IF num GT 4 swap a REPT (num-4) &op a ENDREPT ELSE REPT num &op a ENDREPT ENDIF ENDIF IFNE <dst>,<a> xch a,dst ENDIF ENDM .rr MACRO dst,num .shift rr,dst,num ENDM .rrc MACRO dst,num .shift rrc,dst,num ENDM .rl MACRO dst,num .shift rl,dst,num ENDM .rlc MACRO dst,num .shift rlc,dst,num ENDM ..... ; таблиця має бути після макросу nxlat на відстані ; не більше 255-len від наступної за ; movc a,@a+PC команди, maxlen = довжина таблиці nxlat MACRO tbl,mask,maxlen IFNB mask anl a,mask ENDIF IFNB maxlen IF tbl-($+2+1)+(maxlen-1) > 255 error "nxlat range error" ENDIF ENDIF add a,#tbl-($+2+1) movc a,@a+PC ENDM ... mov a, step_index nxlat step_table, 0x0F,12 ... ... ret step_table: db $01, $03, $02, ... я уже не говорю про разнообразые dec.w MACRO dst ;; acc changed (1/1 shorter) GENSYM ll mov a,dst+1 jnz ll dec dst ll: dec dst+1 ENDM inc.w MACRO dst ;; acc changed (1/1 shorter) GENSYM ll inc dst+1 mov a,dst+1 jnz ll inc dst ll: ENDM </pre> Зачем рутину каждый раз выписывать руками?