U toho odčítání, asi jsem to nějak přehlédl. Když mám SUB A,B tak v A,B jsou kladná nebo záporná čísla. Jak procesor pozná, že načetl a pracuje s kladným číslem 60 000 nebo s nějakým záporným ekvivalemtem -30tisíc ?
Když mam v registrech kladná, tak je naliji do pomocných registrů v ALU. Tam se musí druhý registr nejprve převést do záporného čísla a pak se použije instrukce ADD. Nebo jak to tam přesně funguje? A co když v registru mám záporné a odečítám záporné číslo, takže vlastně sčítám A-(-B).
Pokud se při SUB převátí na záporné číslo, tak musí existovat i instrukce pro negaci.
Ve dvojkovém doplňku je v podstatě jedno, jestli se jedná o kladná nebo záporná čísla. Prostě mikroprocesor vždycky pracuje s plnými šestnácti bity a ono se to po součtu či rozdílu samo srovná - vygeneruje se výsledek, Carry a Zero flagy atd. Příklad je uveden například na http://cs.wikipedia.org/wiki/Dvojkov%C3%BD_dopln%C4%9Bk
Právě toto chování je největší výhodou dvojkového doplňku.
Ještě doplním, že mikroprocesor (ten náš učební) má instrukci COM, což je bitová negace. Doplněk se získá přičtením jedničky, což však ve sčítačce zařídí vhodné nastavení Carry na vstupu.
Procesoru je to jedno, výsledek je vždy stejný, tohle si řeší aplikace sama. Jen se musí dát pozor na to, že obě hodnoty musí být buď se znaménkem nebo bez, nelze je míchat.
Na některých architekturách (např. x86) existuje ještě tzv. sign (nebo negative) flag, který ale neurčuje, jestli se počítá se znaménkem nebo bez, ale jestli poslední matematická operace skončila tak, že ve výsledku byl nastaven nejvyšší bit (což u znaménkového typu znamená, že byl záporný).
aha, takže pro sčítání a odčítání se používají různé obvody? Já myslel, že právě jeden, takže se všechno sčítá a odčítání se řeší tim doplňkem (a ten by se řešil před obvodem sčítání, že by házel číslo do doplňku a zpět..).. Ale to je asi blbost.. Takže pro každou operaci je vlastní obvod? Nebo jak to přesně funguje? (dvojkovej doplněk znám, zajímá mě jak to je řešené hardwarově)
Moje očekávání od tohoto seriálu je, aby po dokončení jsme byli schopni si sestavit vlastní počítač (schopni, ne že budeme). :-D
Vetsinou ne, pro scitani i odcitani se pouziva scitacka, ale druhy parametr je negovany (negator je tesne pred scitackou) a k prvnimu parametru je prictena jednicka (je jedno k jakemu, resi se to pres Carry vstup, ktery do scitacky musi chodit kvuli ADC a SBC/SBB).
Ale hlavni je, ze uz nezalezi na tom, jake ty parametry maji znamenka, ci jestli jsou signed nebo unsigned - to se vubec neresi, proste se pri odecitani druhy parametr zneguje a nekam se pricte jednicka.