Skrypt forum został zaktualizowany
Wszelakie błędy, pytania oraz prośby o nową funkcjonalność zgłaszajcie w tym wątku

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 Postautor: DJ Gruby » pn lut 23, 2015 2:40 pm

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: 1451
Rejestracja: wt wrz 16, 2008 8:04 pm

Re: Porównanie dwóch liczb ze znakiem

#2 Postautor: splatterpunk » pn lut 23, 2015 9:20 pm

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: 1218
Rejestracja: śr wrz 03, 2008 8:23 pm
Grupa: Black Sun

#3 Postautor: Nitro » pn lut 23, 2015 9:33 pm

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

carrion
Posty: 1544
Rejestracja: pt lut 27, 2009 5:38 pm

#4 Postautor: carrion » wt lut 24, 2015 9:18 pm

Pierwszy koder troche gówniany...
retronavigator.com

carrion
Posty: 1544
Rejestracja: pt lut 27, 2009 5:38 pm

#5 Postautor: carrion » czw lut 26, 2015 7:12 pm

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

Awatar użytkownika
Sebaloz/Lepsi.De
Posty: 3606
Rejestracja: ndz wrz 14, 2008 12:02 am

#6 Postautor: Sebaloz/Lepsi.De » czw lut 26, 2015 7:31 pm

carrion pisze:zatkao, kako?

Bo mamy kilka możliwych kombinacji do "przeanalizowania" :)
__________________________
Socjopatyczna Legia Commodore

DJ Gruby

#7 Postautor: DJ Gruby » sob lut 28, 2015 10:16 am

Pierdol się, trollu. Tyle ci powiem.

splatterpunk
Posty: 1451
Rejestracja: wt wrz 16, 2008 8:04 pm

#8 Postautor: splatterpunk » śr mar 04, 2015 12:43 am

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 Postautor: DJ Gruby » śr mar 04, 2015 7:09 am

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: 8
Rejestracja: pn lis 03, 2008 6:52 pm

Re: Porównanie dwóch liczb ze znakiem

#10 Postautor: mono » śr mar 04, 2015 11:29 am

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 #


Wróć do „Programowanie & Produkcje”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości