|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
71GA Član
Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.16 Kraj: Ljubljana
|
Objavljeno: Pon Jan 24, 2011 8:44 am Naslov sporočila: negacija z RSB |
|
|
Ž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 |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.04
|
Objavljeno: Pon Jan 24, 2011 10:47 am Naslov sporočila: |
|
|
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 |
|
|
71GA Član
Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.16 Kraj: Ljubljana
|
Objavljeno: Pon Jan 24, 2011 1:17 pm Naslov sporočila: |
|
|
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 |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.04
|
Objavljeno: Pon Jan 24, 2011 2:37 pm Naslov sporočila: |
|
|
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 |
|
|
71GA Član
Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.16 Kraj: Ljubljana
|
Objavljeno: Pon Jan 24, 2011 4:59 pm Naslov sporočila: |
|
|
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
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:
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)
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 |
|
|
|
|
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: 76 dni
Powered by phpBB © 2001, 2005 phpBB Group
|