Inkrementacja i dekrementacja liczb wielobajtowych

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 07:30, 5 wrz 2011
KMK (Dyskusja | wkład)
(dr. red.)
← Previous diff
Wersja z dnia 10:17, 5 wrz 2011
0xF (Dyskusja | wkład)
(nie przestaje się opłacać, bo jest szybszy, inc można indeksować tylko Xem)
Next diff →
Linia 23: Linia 23:
Niektóre asemblery (np. [[MADS]]) oferują tu ułatwiające życie pseudorozkazy, odpowiednio INW oraz INL. Niektóre asemblery (np. [[MADS]]) oferują tu ułatwiające życie pseudorozkazy, odpowiednio INW oraz INL.
-Technika ta przestaje się opłacać już przy liczbach trzybajtowych; w takim przypadku lepiej jest użyć pętli oszczędzając w ten sposób 3 bajty (n - wielkość ''zmiennej'' w bajtach), o ile, rzecz jasna, mamy "wolny" jeden z rejestrów indeksowych:+W przypadku liczb trzy- i więcej-bajtowych krótszy kod można uzyskać stosując pętlę (n - wielkość ''zmiennej'' w bajtach):
<pre> <pre>
Linia 61: Linia 61:
</pre> </pre>
-To również 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):+Przy liczbach trzy- i więcej-bajtowych krótszy kod uzyskamy stosując pętlę podobną 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):
<pre> <pre>

Wersja z dnia 10:17, 5 wrz 2011

Inkrementacja

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

       inc zmienna
       bne koniec
       inc zmienna+1
koniec

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

       inc zmienna
       bne koniec
       inc zmienna+1
       bne koniec
       inc zmienna+2
koniec

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

W przypadku liczb trzy- i więcej-bajtowych krótszy kod można uzyskać stosując pętlę (n - wielkość zmiennej w bajtach):

       ldx #-n-1
petla  inx
       beq koniec
       inc zmienna-$0100+n,x
       beq petla
koniec

Jeśli zaś chodzi o przeniesienie inkrementowanej wartości do innej zmiennej, pętla może wyglądać tak:

       ldx #-n
       sec
petla  lda zmienna_a-$0100+n,x
       adc #$00
       sta zmienna_b-$0100+n,x
       inx
       bne petla

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

Pętle nie zadziałają prawidłowo, jeśli zmienna znajduje się na stronie zerowej, do tego trzeba je odpowiednio zmodyfikować. 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

Przy liczbach trzy- i więcej-bajtowych krótszy kod uzyskamy stosując pętlę podobną 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 #-n
       clc
petla  lda zmienna-$0100+n,x
       sbc #$00
       sta zmienna-$0100+n,x
       inx
       bne petla

'n' to, jak powyżej, wielkość zmiennej w bajtach. Dla liczby trzybajtowej 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