Inkrementacja i dekrementacja liczb wielobajtowych

From Atariki

(Różnice między wersjami)
Jump to: navigation, search

Wersja z dnia 05:48, 4 wrz 2011

Inkrementacja

Sekwencja rozkazów zwiększająca wartość dwubajtowej liczby całkowitej jest powszechnie znana i często używana:

    inc zmienna
    bne omin
    inc zmienna+1
omin

Sekwencja inkrementująca liczbę trzybajtową wygląda analogicznie:

    inc zmienna
    bne omin
    inc zmienna+1
    bne omin
    inc zmienna+2
omin

Niektóre asemblery (np. MADS) oferują tu ułatwiające życie pseudorozkazy, odpowiednio INW oraz INL.

Technika ta przestaje się opłacać przy liczbach czterobajtowych; w takim przypadku lepiej jest użyć pętli oszczędzając w ten sposób 4 bajty:

    ldx #$fc
    sec
petla
    lda zmienna-$fc,x
    adc #$00
    sta zmienna-$fc,x
    inx
    bne petla

Wykorzystano tu fakt, że rozkaz ADC dodaje do akumulatora wartość podanego argumentu plus wartość znacznika C.

Taka pętla nie zadziała prawidłowo, jeśli "zmienna" znajduje się na stronie zerowej. Patrz Ujemne indeksowanie.

Dekrementacja

Dekrementacja dwubajtowej liczby całkowitej jest nieco bardziej kłopotliwa, niż inkrementacja takowej:

    lda zmienna
    bne d1
    dec zmienna+1
d1  dec zmienna

To z kolei przestaje się opłacać już przy liczbach trzybajtowych; lepiej jest wtedy użyć pętli podobnej do tej powyżej wykorzystując fakt, że działanie znacznika C dla rozkazu SBC jest odwrotne niż dla ADC (SBC odejmuje od akumulatora podaną wartość zwiększoną o odwrotność znacznika C):

    ldx #$fd
    clc
petla
    lda zmienna-$fd,x
    sbc #$00
    sta zmienna-$fd,x
    inx
    bne petla

Dla liczby trzybajtowej (jakiej dotyczy przykład) zysk wynosi 5 bajtów, a dla czterobajtowej - aż 13. Jak powyżej, jeśli "zmienna" jest na stronie zerowej, pętlę trzeba odpowiednio zmodyfikować.

Personal tools