Vlákno názorů k článku Mercury: Abstrakce nad algoritmy od Clock - V assembleru se dá taky for cyklus nahradit...

  • Článek je starý, nové názory již nelze přidávat.
  • 11. 3. 2004 11:54

    Clock (neregistrovaný)

    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



  • 11. 3. 2004 16:51

    Roman Kratochvil (neregistrovaný)

    > 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... ;-))