Porównanie dwóch liczb ze znakiem

Szukasz drobnej pomocy przy kodowaniu, albo chcesz przedstawić światu swoją gotową lub w trakcie realizacji produkcję? To właściwy dział.
Wiadomość
Autor
DJ Gruby

Porównanie dwóch liczb ze znakiem

#1 Post autor: DJ Gruby »

W jaki sposób porównujecie standardowo dwie liczby ze znakiem? Bez znaku sprawa jest prosta:

Kod: Zaznacz cały

            lda A
            sec
            sbc B
            bcs A_jest_wieksze
            ; B_jest_wieksze
W przypadku liczb ze znakiem sprawa nieco się komplikuje, bo mamy kilka możliwych kombinacji do przeanalizowania:

- A dodatnie, B dodatnie
- A dodatnie, B ujemne
- A ujemne, B dodatnie
- A ujemne, B ujemne

Rozpatrujecie osobno każdy z przypadków, czy istnieje jakiś sprytny sposób, żeby wykonać takie porównanie prościej?

splatterpunk
Posty: 1457
Rejestracja: 16 wrz 2008, 20:04

Re: Porównanie dwóch liczb ze znakiem

#2 Post autor: splatterpunk »

DJ Gruby pisze:czy istnieje jakiś sprytny sposób, żeby wykonać takie porównanie prościej?
Wydaje mi się, że tak.

Awatar użytkownika
Nitro
Posty: 1544
Rejestracja: 03 wrz 2008, 20:23
Grupa: Black Sun

#3 Post autor: Nitro »

http://tnij.org/tccompare
pierwszy link, dwóch koderów, wstyd :P

Awatar użytkownika
carrion
Posty: 2329
Rejestracja: 27 lut 2009, 17:38
Kontakt:

#4 Post autor: carrion »

Pierwszy koder troche gówniany...
c64portal.pl, retronavigator.com

Awatar użytkownika
carrion
Posty: 2329
Rejestracja: 27 lut 2009, 17:38
Kontakt:

#5 Post autor: carrion »

heh liczylem że kaktus
zacznie marudzić, ale widać
zatkao, kako?
c64portal.pl, retronavigator.com

Awatar użytkownika
Sebaloz/Lepsi.De
Posty: 3949
Rejestracja: 14 wrz 2008, 00:02

#6 Post autor: Sebaloz/Lepsi.De »

carrion pisze:zatkao, kako?
Bo mamy kilka możliwych kombinacji do "przeanalizowania" :)
__________________________
Socjopatyczna Legia Commodore

DJ Gruby

#7 Post autor: DJ Gruby »

Pierdol się, trollu. Tyle ci powiem.

splatterpunk
Posty: 1457
Rejestracja: 16 wrz 2008, 20:04

#8 Post autor: splatterpunk »

Wracając do tematu.
Zabawa zaczyna się dopiero jak porównujemy liczby 16-bitowe ze znakiem.
Sprawdzona już przeze mnie procedura (można znaleźć jako jeden
z przykładów na http://www.6502.org/tutorials/compare_beyond.html)
porównująca NUM1 z NUM2. Jeśli NUM1 < NUM2 to skok do LABEL4.

Kod: Zaznacz cały


           SEC
           LDA NUM1H  ; compare high bytes
           SBC NUM2H
           BVC LABEL1 ; the equality comparison is in the Z flag here
           EOR #$80   ; the Z flag is affected here
    LABEL1 BMI LABEL4 ; if NUM1H < NUM2H then NUM1 < NUM2
           BVC LABEL2 ; the Z flag was affected only if V is 1
           EOR #$80   ; restore the Z flag to the value it had after SBC NUM2H
    LABEL2 BNE LABEL3 ; if NUM1H <> NUM2H then NUM1 > NUM2 (so NUM1 >= NUM2)
           LDA NUM1L  ; compare low bytes
           SBC NUM2L
           BCC LABEL4 ; if NUM1L < NUM2L then NUM1 < NUM2
    LABEL3
           ...
    LABEL4
           ...   


DJ Gruby

#9 Post autor: DJ Gruby »

carrion pisze:Pierwszy koder trochę gówniany...
Nie ma to jak nie mając nic do powiedzenia w temacie, jebać po ludziach za to, że chcą się czegoś nowego nauczyć... :roll:
splatterpunk pisze:Sprawdzona już przeze mnie procedura (można znaleźć jako jeden z przykładów na http://www.6502.org/tutorials/compare_beyond.html) porównująca NUM1 z NUM2.
I to jest konkretna odpowiedź. Dzięki, Splatter, za podzielenie się przykładem. Jestem pewien, że przyda się nie tylko mnie. 8)

mono
Posty: 27
Rejestracja: 03 lis 2008, 18:52
Grupa: tristesse
Kontakt:

Re: Porównanie dwóch liczb ze znakiem

#10 Post autor: mono »

DJ Gruby pisze:czy istnieje jakiś sprytny sposób, żeby wykonać takie porównanie prościej?
Jeśli tylko masz możliwość proponowałbym przesunięcie obydwu liczb do dziedziny unsigned (przez zanegowanie najstarszego bitu liczby):

Kod: Zaznacz cały

  lda num1
  cmp num2
  lda #$80
  eor num2+1
  sta tmp
  lda #$80
  eor num1+1
tmp = *+1
  sbc #
  bcc lt
gteq:
Edit: Oczywiście jak masz liczby większej precyzji, to eor dotyczy tylko najstarszego bitu liczby, więc najstarszego bajtu - pozostałe porównujesz zwyczajnie:

Kod: Zaznacz cały

  lda num1
  cmp num2
  lda num1+1
  sbc num2+1
  ...
  lda #$80
  eor num2+n
  sta tmp
  lda #$80
  eor num1+n
tmp = *+1
  sbc #

ODPOWIEDZ