Что бы было понятней, привожу пример кода - сегодня выделил в отдельную подпрограмму . Здесь вычисляется хэш-значение меток для помещения их в таблицу вида - хеш метки - соответствующий метке адрес .
Хотя и наоборот ,возможно, понятней не будет.
Код:
;sub-----------------------[ Sub_CalcHash ]
;адрес лексемы должен быть в Sub_CalcHash.A
dd 0
CalcHash:
Sub_CalcHash =$/4
putMemConst .hash,HASHVALUE ;init .hash start value for make CRC32
putMemConst .C,0
putMemMem .B,.A ;.A = arg = ptr on string
.NextCh = $/4
putMem_Mem_ .A,.B
jmpLabelIfMemEConst .l1, .A, _Space ;если .A = const
jmpLabelIfMemEConst .l1, .A, SPEC_CH_LABEL ;если .A = const
jmpLabelIfMemEConst .l1, .A, SPEC_CH_LABEL ;если .A = const
jmpLabelIfMemZ .l1,.A ; (if .A = 0 then goto .l1)
addMemMem .hash,.A ;.hash = .hash +.A (без учета переноса)
shlMemConst .hash,1 ;cut 1 bits
incMem .B
incMem .C
jmpLabelIfMemEConst .l1,.C , _MaxSizeLex
jmpLabel .NextCh ;goto next char
.l1 =$/4 ;конец рыбалки:)
putMemMem .A,.hash ;.A = return value
jmpMem Sub_CalcHash - 1
.hash = $/4
dd 0
.A = $/4
dd 0
.B = $/4
dd 0
.C = $/4
dd 0