www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

negacija z RSB

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.16
Kraj: Ljubljana

PrispevekObjavljeno: Pon Jan 24, 2011 8:44 am    Naslov sporočila:  negacija z RSB Odgovori s citatom

Živijo imam en primer, kjer mi ni jasna negacija RSB (reverse substraction).

Koda:
r1=0x00000077
RSB r0, r1, #0
r0=0xffffff89


Mi lahko kdo pove, kako sem iz 0x00000077 dobil 0xffffff89 ?


LP Žiga
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.06

PrispevekObjavljeno: Pon Jan 24, 2011 10:47 am    Naslov sporočila:   Odgovori s citatom

Koda:

100000000 ; 8 ničel je v resnici 1 in 8 ničel. Vsaka 0 pomeni število 16
000000077 ; 16-7=9 , ena dalje, 16 - (7+1) = 8 , ena dalje , 16 - (0+1) = 15 = F ...
0FFFFFF89

Vse gre enako, kot pri desetiškem odštevanju, samo da je pri zgornjemu 0 enako 16, 1=17, 2=18, 3=19,...

Kadar odštevaš večje število od manjšega, moraš večjega "rahlo predelati" da bo imelo en bit več od spodnjega. Potem nenadoma odštevaš manjše število od večjega.
Sicer pa si oglej odštevanje z dvojiškim komplementom.

Ah, ja, RSB v bistvu ni negacija, ampak negacija + 1 . Tak je namreč princip odštevanja z dvojiškim komplementom.
1. negacija bitov v členu ??? (šment, pozabil sem izraze, odštevanec, ???, razlika)
2. rezultatu se prišteje 1
3. sešteje se odštevanec in prejšnji rezultat

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.16
Kraj: Ljubljana

PrispevekObjavljeno: Pon Jan 24, 2011 1:17 pm    Naslov sporočila:   Odgovori s citatom

igo je napisal/a:
Koda:

100000000 ; 8 ničel je v resnici 1 in 8 ničel. Vsaka 0 pomeni število 16
000000077 ; 16-7=9 , ena dalje, 16 - (7+1) = 8 , ena dalje , 16 - (0+1) = 15 = F ...
0FFFFFF89

OK torej iz ničle si naredil dvojiški komplement tako, da si ničle zamenjal z enicami, prištel ena in zanemaril priliv 0 = (1) 00000000.
Tudi iz pozitivne številke si naredil eniški komplement, čeprav nisi pač nič naredil ker je številka pozitivna.

Potem naprej pa mi ni več jasno, kako jih odšteješ. V kodi večkrat napipšeš ena dalje a ne vem kje to enico pridelaš. Ali se da to še malo razložiti.

Hvala.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.06

PrispevekObjavljeno: Pon Jan 24, 2011 2:37 pm    Naslov sporočila:   Odgovori s citatom

Koda:

 00000000 ; iz te nisem napravil ničesar ! Tista 1 spredaj je zaradi razumevanja principa
-00000077
=FFFFFF89

 100000000 ;
-000000077
=0FFFFFF89

... ena dalje ...
Hočeš odšteti 0 minus 7.
Če je 0 enako 16, potem je 16-7=9. Rezultat je 9, kar je prav.
Vendar je to samo poenostavitev, da lažje računaš. Še vedno si odštel večjo številko (7) od manjše (0), zato pride do prenosa pri naslednji cifri. Ta prenos moraš upoštevati tako, da ga prišteješ odštevancu naslednje cifre. Prenos na najvišji cifri pa ti določi predznak rezultata. Ampak ta prenos je potem deveti bit izmed osmih, zato moraš vedeti, kaj njegova vrednost pomeni za preostalih 8 bitov.

Lahko bi rekel, da 00000000 po negaciji postane FFFFFFFF, nato prišteješ 1 in dobiš 100000000, vendar se to dejansko ne zgodi.
Zmanjševalec ostane nedotaknjen, samo odštevanec doživi "preobrazbo" v svoj dvojiški komplement.

Povrhu vsega si ti odšteval 00000000 - 00000077, zato je rezultat enak dvojiškemu komplementu od 00000077. Če bi odšteval narimer
Koda:

  0000001F
- 00000077
  FFFFFF98
bi bil rezultat enak
  10000001F
- 000000077
  0FFFFFF98 , kjer 0 pomeni, da ima rezultat negativen predznak, pri 1 bi bil pa pozitiven. Na tebi je, da v nadaljevanju programa to ustrezno upoštevaš.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.16
Kraj: Ljubljana

PrispevekObjavljeno: Pon Jan 24, 2011 4:59 pm    Naslov sporočila:   Odgovori s citatom

No da poiskusim sam narediti en primer da vidim, če sem razumel.

recimo, da je r1 = 0x00000011 (3) in r2=0x00000001 (1), potem naredim reverse substraction
Koda:
RSB r0, r1, r2

Reverse substraction pomeni, da prvega odštevaš od drugega, torej nekaj takega (r0=r2 - r1).

desetiško bi ito izgledalo približno takole:
r0=1 - 3
r0=-2

dvojiško z drugim komplementom pa:
Koda:
00000001
-00000011

ker lahko enačbo r0=1-3 poenostavim v r0= 1 + (-3) lahko zgornji zapis spremenim tako, da sedaj seštevam 1 (v binarni obliki) s komplementom števila -3 (seveda v binarni obliki)
Koda:
00000001
+11111101

Sedaj pa kako dobiti rezultat (tu najbrž pride v poštev "ena naprej").

Seštejem najprej najnižja bita
in ker 1 + 1 = 2 (kar je binarno 10) na najnižjem bitu B0 ostane 0, medtem ko se 1 prenese naprej na bit B1.

Sledi seštevanje bitov B1, kjer imam sedaj 0 + 1 = 1 (kar je binarno 01) na bitu B1 ostane 1, medtem ko se 0 prenese naprej.

Rezultat je 11111110. Ker je najvišji bit enak 1 je število negativno. Njegovo vrednost pa dobim tako da dobljeni rezultat negiram in pomnožim z 1. 00000001 +1 = 00000010 dobil sem desetiško vrednost 2, a ne pozabimo na predznak v dvojiškem komplementu, ki prinese -2, kar se sklada z rešitvijo v računu z desetiškimi števili
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 67 dni


Powered by phpBB © 2001, 2005 phpBB Group