Porównywanie liczb wielobajtowych

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 00:04, 18 paź 2019
Mono (Dyskusja | wkład)
(jeszcze =)
← Previous diff
Aktualna wersja
Mono (Dyskusja | wkład)
(A ? B)
Linia 17: Linia 17:
... ...
and data+N and data+N
- cmp #$FF+ eor #$FF
</pre> </pre>
Znacznik Z=1 oznacza, że liczba jest równa $FF..FF. Znacznik Z=1 oznacza, że liczba jest równa $FF..FF.
Linia 23: Linia 23:
Zmieniając Zmieniając
<pre> <pre>
- cmp #$FF+ eor #$FF
</pre> </pre>
na na
<pre> <pre>
- cmp #$99+ eor #$99
</pre> </pre>
można również testować czy liczba BCD jest równa 99..99 (nie wymaga wcześniejszego ustawienia bitu D). można również testować czy liczba BCD jest równa 99..99 (nie wymaga wcześniejszego ustawienia bitu D).
 +
 +Metoda nie modyfikuje znacznika C.
 +
 +== Zgodność znaków liczb U2 ==
 +
 +Test polega na sprawdzeniu MSB argumentów:
 +<pre>
 + lda dataA+N
 + eor dataB+N
 +</pre>
 +* N=0 - znaki zgodne
 +* N=1 - znaki różne
== A=B == == A=B ==
Linia 49: Linia 61:
... ...
</pre> </pre>
-Działa też dla liczb U2 i BCD (nie wymaga wcześniejszego ustawienia bitu D).+lub
 +<pre>
 + lda dataA
 + eor dataB
 + bne rozne
 + lda dataA+1
 + eor dataB+1
 + bne rozne
 + ...
 + lda dataA+N
 + eor dataB+N
 + bne rozne
 +rowne:
 + ...
 +rozne:
 + ...
 +</pre>
 + 
 +Działa też dla liczb U2 i BCD (nie wymaga wcześniejszego ustawienia bitu D). Ostatnia wersja nie modyfikuje znacznika C.
Wykorzystując zmienną roboczą: Wykorzystując zmienną roboczą:
Linia 71: Linia 101:
== A ? B == == A ? B ==
 +Tradycyjna metoda porównywania liczb wielobajtowych
 +<pre>
 + lda dataA
 + cmp dataB
 + lda dataA+1
 + sbc dataB+1
 + ...
 + lda dataA+N
 + sbc dataB+N
 +</pre>
 +pozwala na testowanie wyłącznie relacji < i >=:
 +* C=0 - A < B
 +* C=1 - A >= B
 +
Porównując liczby od najstarszego bajtu można dokonać testu relacji <, =, > Porównując liczby od najstarszego bajtu można dokonać testu relacji <, =, >
<pre> <pre>
Linia 143: Linia 187:
<b>UWAGA</b> <b>UWAGA</b>
W dwóch ostatnich przypadkach znacznik N ulega zniszczeniu przy ostatnim ORA TEMP, więc w przypadku porównywania liczb U2 można test na N wykonać wcześniej. W dwóch ostatnich przypadkach znacznik N ulega zniszczeniu przy ostatnim ORA TEMP, więc w przypadku porównywania liczb U2 można test na N wykonać wcześniej.
-== Zgodność znaków liczb U2 == 
- 
-Test polega na sprawdzeniu MSB argumentów: 
-<pre> 
- lda dataA+N 
- eor dataB+N 
-</pre> 
-* N=0 - znaki zgodne 
-* N=1 - znaki różne 
[[Kategoria:Niezbędnik kodera]] [[Kategoria:Niezbędnik kodera]]

Aktualna wersja

Spis treści

Zero

  lda data
  ora data+1
  ...
  ora data+N

Znacznik Z=1 oznacza, że liczba jest równa 0. Ta metoda działa również w przypadku liczb BCD (nie wymaga wcześniejszego ustawienia bitu D).

MAX

  lda data
  and data+1
  ...
  and data+N
  eor #$FF

Znacznik Z=1 oznacza, że liczba jest równa $FF..FF.

Zmieniając

  eor #$FF

na

  eor #$99

można również testować czy liczba BCD jest równa 99..99 (nie wymaga wcześniejszego ustawienia bitu D).

Metoda nie modyfikuje znacznika C.

Zgodność znaków liczb U2

Test polega na sprawdzeniu MSB argumentów:

  lda dataA+N
  eor dataB+N
  • N=0 - znaki zgodne
  • N=1 - znaki różne

A=B

  lda dataA
  cmp dataB
  bne rozne
  lda dataA+1
  cmp dataB+1
  bne rozne
  ...
  lda dataA+N
  cmp dataB+N
  bne rozne
rowne:
  ...
rozne:
  ...

lub

  lda dataA
  eor dataB
  bne rozne
  lda dataA+1
  eor dataB+1
  bne rozne
  ...
  lda dataA+N
  eor dataB+N
  bne rozne
rowne:
  ...
rozne:
  ...

Działa też dla liczb U2 i BCD (nie wymaga wcześniejszego ustawienia bitu D). Ostatnia wersja nie modyfikuje znacznika C.

Wykorzystując zmienną roboczą:

  lda dataA
  eor dataB
  sta temp
  lda dataA+1
  eor dataB+1
  ora temp
  sta temp
  ...
  lda dataA+N
  eor dataB+N
  ora temp

Znacznik Z odpowiada za relacje = i <>

  • Z=1 - A = B
  • Z=0 - A <> B

Metoda nie modyfikuje znacznika C. Nadaje się do porównywania liczb BCD i U2.

A ? B

Tradycyjna metoda porównywania liczb wielobajtowych

  lda dataA
  cmp dataB
  lda dataA+1
  sbc dataB+1
  ...
  lda dataA+N
  sbc dataB+N

pozwala na testowanie wyłącznie relacji < i >=:

  • C=0 - A < B
  • C=1 - A >= B

Porównując liczby od najstarszego bajtu można dokonać testu relacji <, =, >

  lda dataA+N
  cmp dataB+N
  bcc mniejsze
  bne wieksze
  lda dataA+N-1
  cmp dataB+N-1
  bcc mniejsze
  bne wieksze
  ...
  lda dataA
  cmp dataB
  bcc mniejsze
  bne wieksze
rowne:
  ...
wieksze:
  ...
mniejsze:
  ...

Działa dla BCD (nie wymaga wcześniejszego ustawienia bitu D).

Wykorzystując zmienną roboczą można testować relacje <. =, >=, >:

  sec
  lda dataA
  sbc dataB
  sta temp
  lda dataA+1
  sbc dataB+1
  ora temp
  sta temp
  ...
  lda dataA+N
  sbc dataB+N
  ora temp

Znaczniki Z i C odpowiadają za relacje:

  • C=0 - A < B,
  • Z=1 - A = B,
  • C=1 - A >= B,
  • C=1 przy uprzednim wykluczeniu Z=1 - A > B.

Dodatkowo znacznik V odpowiada za przepełnienie przy porównywaniu liczb U2. Ta metoda nadaje się do porównań liczb BCD (wymaga wcześniejszego ustawienia bitu D).

Zamieniając miejscami argumenty można testować relacje >, =, <=

  sec
  lda dataB
  sbc dataA
  sta temp
  lda dataB+1
  sbc dataA+1
  ora temp
  sta temp
  ...
  lda dataB+N
  sbc dataA+N
  ora temp

gdzie analogicznie:

  • C=0 - A > B,
  • Z=1 - A = B,
  • C=1 - A <= B,
  • C=1 przy uprzednim wykluczeniu Z=1 - A < B.

Znacznik V odpowiada za przepełnienie przy porównywaniu liczb U2. Ta metoda również nadaje się do porównań liczb BCD (wymaga wcześniejszego ustawienia bitu D).

UWAGA W dwóch ostatnich przypadkach znacznik N ulega zniszczeniu przy ostatnim ORA TEMP, więc w przypadku porównywania liczb U2 można test na N wykonać wcześniej.

Personal tools