Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Vlákno názorů k článku
Mercury: Abstrakce nad algoritmy

Clock
Clock (neregistrovaný)
11. 3. 2004 11:54

Rekurzivní volání

V assembleru se dá taky for cyklus nahradit rekurzí - voláním: Mějme for cyklus, který přičítá jedno pole k druhému. V edi je adresa pole ke kterému se přičítá, v esi adresa které se přičítá, v ecx počet (ecx nesmí být 0):

aa: mov eax,[edi]
add eax,[esi]
mov [edi],eax
add edi,4
add esi,4
dec exc
jnz aa

Tak ten se přepíše na rekurzivní volání takhle
mov ecx,4
push ecx
aa: pop eax
mov eax,[edi]
add eax,[esi]
mov [edi],eax
add edi,4
add esi,4
dec ecx
jz bb
call aa
bb:

Na assembleru Z80 dokonce na to byla speciálni instrukce call nz :) Takže tam by se to dalo napsat (BC-počet, HL-adresa zdroje, DE-adres cíle)
push bc
aa: pop ix
ld a,[de]
add a,[hl]
ld [de],a
inc de
inc hl
dec bc (doufám že tahle instrukce ovlivňuje ten správnej flag - nechce se mi teď hrabat v datasheetu od Z80 ;-) )
call nz, aa



Roman Kratochvil
Roman Kratochvil (neregistrovaný)
11. 3. 2004 16:51

Re: Rekurzivní volání

> dec bc (doufám že tahle instrukce ovlivňuje ten správnej flag - nechce se mi teď hrabat v datasheetu od Z80 ;-)

Ne, nutno pouzit klasicky trik
ld a,b
or c

(To je samozrejme totalne offtopic, jenom me zrovna tohle i po tech cca 8mi letech od meho posledniho kodu pro Z80 vytanulo na mysli, nektere postupy se holt zadrou pod kuzi hluboko... ;-))

Zasílat nově přidané příspěvky e-mailem