Hello Kirill.
Tue Apr 08 2008 23:26, Kirill Frolov wrote to Slav Matveev:
KF> .set loop = . KF> add a, b KF> nop KF> jnz loop KF> .set loop = . KF> xor c KF> nop KF> jc loop
KF> Смысл думаю понятен.
Я когда-то нарисовал для ASM80 "структурные макросы", потом портировал их для
51-го. Выглядело это примерно так:
DOIF Z ... ... ELSIF C ... ... DOELSE ... ... DONE
DO ... ... LOOP NC
А вот реализация для Asm51 от 2500AD.
_en1 var 0 _en2 var 0 _en3 var 0 _en4 var 0 _en5 var 0
_dn1 var 0 _dn2 var 0 _dn3 var 0 _dn4 var 0 _dn5 var 0
_cn1 var 0 _cn2 var 0 _cn3 var 0 _cn4 var 0 _cn5 var 0
_lev var 0 _tmp var 0 _tmp1 var 0
__jmp macro lbl,cn,arg1,arg2 ifsame cn,djnz djnz arg1,lbl else ifma 4 cj|cn arg1,arg2,lbl else ifma 3 j|cn arg1,lbl else ifma 2 j|cn lbl else sjmp lbl endif endif endif endif endm
jnnc macro lbl jc lbl endm
jnnb macro bi,lbl jb bi,lbl endm
jnnz macro arg jz arg endm
jnnbc macro bi,lbl jbc bi,lbl endm
__invj macro lbl,cn,arg1,arg2 ifma 4 cjn|cn arg1,arg2,lbl else ifma 3 jn|cn arg1,lbl else ifma 2 jn|cn lbl else sjmp lbl endif endif endif endm
; вспомогательные операторы
; выход из блока BREAK macro cn,arg1,arg2 _tmp var _dn|<_lev>
__jmp $_don|<_lev>|<_tmp>,cn,arg1,arg2 endm
; переход в часть DOELSE GOELSE macro cn,arg1,arg2 _tmp var _en|<_lev>
__jmp $_els|<_lev>|<_tmp>,cn,arg1,arg2 endm
; "continue" NEXT macro cn,arg1,arg2 _tmp var _cn|<_lev>
__jmp $_do|<_lev>|<_tmp>,cn,arg1,arg2 endm
; дополнительное условие входа в блок ENTER macro cn,arg1,arg2 _tmp var _dn|<_lev+1>
__jmp $_do|<_lev+1>|<_tmp>,cn,arg1,arg2 endm
; основные операторы
; начало блока DO macro _lev var _lev+1 _tmp var _dn|<_lev>
$_do|<_lev>|<_tmp>: endm
; "else" DOELSE macro _tmp var _dn|<_lev>
sjmp $_don|<_lev>|<_tmp>
_tmp var _en|<_lev>
$_els|<_lev>|<_tmp>: _en|<_lev> var _tmp+1 endm
; начало с проверкой условия DOIF macro cn,arg1,arg2 _lev var _lev+1 _tmp var _en|<_lev>
__invj $_els|<_lev>|<_tmp>,cn,arg1,arg2 _tmp var _dn|<_lev>
$_do|<_lev>|<_tmp>: endm
ELSIF macro cn,arg1,arg2 _tmp var _dn|<_lev>
sjmp $_don|<_lev>|<_tmp>
_tmp var _en|<_lev>
$_els|<_lev>|<_tmp>: _en|<_lev> var _tmp+1 __invj $_els|<_lev>|<_tmp+1>,cn,arg1,arg2 endm
WHILE macro cn,arg1,arg2 _lev var _lev+1 _tmp var _dn|<_lev>
$_do|<_lev>|<_tmp>: _tmp var _en|<_lev>
__invj $_els|<_lev>|<_tmp>,cn,arg1,arg2 endm
; конец блока DONE macro _tmp var _dn|<_lev>
$_don|<_lev>|<_tmp>: _dn|<_lev> var _tmp+1 _tmp var _en|<_lev>
$_els|<_lev>|<_tmp>: _en|<_lev> var _tmp+1 _lev var _lev-1 endm
; конец с зацикливанием LOOP macro cn,arg1,arg2 _tmp var _cn|<_lev>
$_con|<_lev>|<_tmp>: _cn|<_lev> var _tmp+1 _tmp var _dn|<_lev>
__jmp $_do|<_lev>|<_tmp>,cn,arg1,arg2 $_don|<_lev>|<_tmp>: _dn|<_lev> var _tmp+1 _tmp var _en|<_lev>
$_els|<_lev>|<_tmp>: _en|<_lev> var _tmp+1 _lev var _lev-1 endm