Strona 1 z 1

Porównanie dwóch liczb ze znakiem

: 23 lut 2015, 14:40
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?

Re: Porównanie dwóch liczb ze znakiem

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

: 23 lut 2015, 21:33
autor: Nitro
http://tnij.org/tccompare
pierwszy link, dwóch koderów, wstyd :P

: 24 lut 2015, 21:18
autor: carrion
Pierwszy koder troche gówniany...

: 26 lut 2015, 19:12
autor: carrion
heh liczylem że kaktus
zacznie marudzić, ale widać
zatkao, kako?

: 26 lut 2015, 19:31
autor: Sebaloz/Lepsi.De
carrion pisze:zatkao, kako?
Bo mamy kilka możliwych kombinacji do "przeanalizowania" :)

: 28 lut 2015, 10:16
autor: DJ Gruby
Pierdol się, trollu. Tyle ci powiem.

: 04 mar 2015, 00:43
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
           ...   


: 04 mar 2015, 07:09
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)

Re: Porównanie dwóch liczb ze znakiem

: 04 mar 2015, 11:29
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 #