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>
Зачем рутину каждый раз выписывать руками?