Porównywanie liczb wielobajtowych

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 01:03, 18 paź 2019
Mono (Dyskusja | wkład)
(tradycyjne porownianie)
← Previous diff
Aktualna wersja
Mono (Dyskusja | wkład)
(A ? B)
Linia 105: Linia 105:
lda dataA lda dataA
cmp dataB cmp dataB
- sta temp 
lda dataA+1 lda dataA+1
sbc dataB+1 sbc dataB+1

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