Kysymys:
Kuinka 8-bittinen CPU voi laskea isot luvut?
Med ben Amar
2015-04-23 10:11:46 UTC
view on stackexchange narkive permalink

Yritän suunnitella opetettavan 8-bittisen suorittimen Logisimiin. Onko mahdollista laskea suuria lukuja 8-bittisellä suorittimella?

32-bittisessä tietokoneessa voit laskea 32-bittisiä isompia lukuja, mielestäni se on ohjelmistotemppu, mutta kuka selittää minulle miten se toimii?

8 bittiä kerrallaan.
Koulussa olet oppinut numerot 0-9, mutta vedon vetoni, että osaat laskea sitä pidemmälle ja jopa tehdä joitain peruslaskelmia mielessä.Kysy itseltäsi, kuinka hallitset sitä, koska "numerot" voivat olla erilaisia, mutta menetelmä on * täsmälleen identtinen.Taika, josta et todennäköisesti tiennyt, on aritmeettisen yksikön piilotettu 9. bitti, jota kutsutaan 'kantolipuksi'.
Kolme vastused:
alex.forencich
2015-04-23 11:51:02 UTC
view on stackexchange narkive permalink

On varmasti mahdollista työskennellä erittäin suurilla numeroilla jopa 8- tai 4-bittisissä tietokoneissa. Se ei ole kovin tehokas, mutta se on mahdollista. Tämä tehdään tekemällä numeroita palasina erityisten prosessoriohjeiden tuella.

Yleinen 8-bittinen mikrokontrolleri on Atmel AVR -sarja. 8-bittisten numeroiden lisäämiseksi se käyttää käskyä nimeltä ADD. Tätä ohjetta käytetään lisäämään kaksi rekisteriarvoa yhteen. Voit esimerkiksi tehdä

  LDI R16, 5LDI R17, 10ADD R16, R17; R16 = 15  

lisätä R16 ja R17 ja lisätä tulos R16: een. Jos haluat lisätä 16-bittisiä numeroita, teet tämän periaatteessa vain useita kertoja. Siellä on kuitenkin salpa: kantokärki. Toinen AVR-käsky on ADC, ADd: lle ja Carrylle. Tämä tekee täsmälleen saman asian kuin ADD, mutta se lisää myös carry-lipun. Sekä ADD että ADC asettavat kantolipun, jos lisäystoiminto ylittää. Oletetaan, että jos lisäät 128-128, saat 0 tuloksena kantolipun asetuksella. Jos soitat ADC: lle kantolipun ollessa asetettu, se lisää tulokseen 1. Tässä on esimerkki 16-bittisestä lisäyksestä:

  LDI R16, 232LDI R17, 3; R17: R16 = 1000LDI R18, 208LDI R19, 7; R19: R18 = 2000ADD R16, R18ADC R17, R19; R16 = 184; R17 = 11; R17: R16 = 3000  

Tämä voidaan toistaa niin monta kertaa kuin on tarpeen suurten numeroiden lisäämiseksi. Huomaa, että tämän tukemiseksi tarvitaan pieni määrä logiikkaa: kyky syöttää kantolippu summaimen kuljettamiseen.

Vastaavaa prosessia voidaan käyttää numeroiden kertomiseen. 16-bittisten kertolaskujen suorittaminen 8-bittisessä prosessorissa vaatii 4 8-bittistä kertomista ja useita lisäyksiä. Menettely on täsmälleen sama kuin numeroiden kertominen käsin yksi numero kerrallaan, paitsi että käytät tavuja numeroiden sijaan. Sinun on kerrottava kaikki neljä mahdollista tavupareja ja lisättävä ne sitten niiden paikkojen arvojen mukaan. Esimerkki AVR ASM: ssä:

  LDI R16, 232LDI R17, 3; R17: R16 = 1000LDI R18, 208LDI R19, 7; R19: R18 = 2000MUL R16, R18
; R1: R0 = R16 * R18 (1-paikkainen tuote) MOVW R3: R2, R1: R0; R3: R2 = R16 * R18MUL R16, R19; R1: R0 = R16 * R19 (256 paikan tuote # 1) CLR R4ADD R3, R0ADC R4, R1; R4: R3: R2 = R16 * R18 + 256 * R16 * R19MUL R17, R18; R1: R0 = R17 * R18 (256 paikan tuote # 2) LISÄÄ R3, R0ADC R4, R1; R4: R3: R2 = R16 * R18 + 256 * (R16 * R19 + R17 * R18) MUL R17, R19; R1: R0 = R17 * R19 (65536 paikan tuote) CLR R5ADD R4, R0ADC R5, R1; R5: R4: R3: R2 = R16 * R18 + 256 * (R16 * R19 + R17 * R18) + 65536 * R17 * R19; R5: R4: R3: R2 = 2000000  

Huomaat, että juuri näin työskentelet numeroiden kanssa käsin paperilla, mutta sen sijaan, että työskentelisit 10 perusnumeron kanssa, CPU sanakokoisilla bittilohkoilla - tässä tapauksessa 8 bittiä.

Jos käytät CPU: ta, joka voi toimia useammalla bitillä kerrallaan, työskentely suurten numeroiden kanssa on helpompaa, koska se vaatii vähemmän ohjeita. Voit kuitenkin käyttää samoja tekniikoita työskennellessäsi suurempien numeroiden kanssa kuin komentosarja tukee suoraan.

sweber
2015-04-23 10:41:07 UTC
view on stackexchange narkive permalink

Kuten sanoitte, 32-bittiset suorittimet pystyvät käsittelemään yli 32-bittisiä numeroita, joten miksi 8-bittinen prosessori ei pystyisi tekemään tätä?

Jos lisäät kaksi numeroa, aloitat viimeisestä bitistä molemmista. Jos yksi niistä on 1, tulos on 1, jos molemmat ovat 1, tulos on 0, ja joudut kantamaan 1 toisen bitin laskemiseen.

Toisella bitillä sinulla on numeroiden kaksi bittiä ja siirretty bitti. Jos yksi tai kaikki kolmesta ovat 1, tulos on 1. Jos kaksi tai kaikki ovat 1, joudut jälleen kantamaan 1 kolmannen bitin laskemiseen.

Tämä tehdään yleensä laitteistossa , ts. loogisia portteja on, laitat vain numerot tuloihin ja saat tuloksen. Huomaa, että jos sinulla on 8-bittinen summain, saat myös niin kutsutun carry flag -merkin lisäämällä 8. bittiä.

Jos lisäät vain kaksi 8-bittistä numeroa, kantolippu ilmoittaa vain, jos tulos on suurempi kuin 255, suurin luku, johon 8-bittinen (allekirjoittamaton) kokonaisluku mahtuu.

Jos sinulla on suurempia lukuja, alat nyt lisätä toisen tavun bittiä ja ottaa huomioon edellisen lisäyksen kantolippu tämän tavun ensimmäisen bitin lisäämisen aikana.

Ainoa ero on, että 32-bittinen keskusyksikkö voi lisätä 32-bittisiä kerralla, joten 64-bittisten numeroiden lisääminen koostuu kahdesta vaiheesta, kun taas 8-bittinen suoritin tarvitsee 8 vaihetta.

Näin voit lisätä minkä tahansa kokoisia numeroita mihin tahansa suorittimeen . Kaikki muu matematiikka tehdään samalla tavalla, pienempi suoritin tarvitsee vain lisää vaiheita.

Kaiken kokoisten numeroiden lisäämistä rajoittaa käytettävissä oleva RAM.Jos sinulla on 1 kt 8-bittiselle prosessorille, kahden 1024-bittisen numeron lisääminen on mahdollista, mutta 4096-bittisille numeroille tarvitset enemmän RAM-muistia.
Pete Becker
2015-04-23 16:28:55 UTC
view on stackexchange narkive permalink

Kun lisäät kaksi numeroa lyijykynällä ja paperilla, työskentelet oikealta vasemmalle, lisäämällä kaksi numeroa, tallentamalla tuloksen ja kuljettamalla ylivuotoa. Suurten numeroiden lisääminen tietokoneeseen toimii samalla tavalla. Kutakin lukua edustaa joukko "numeroita", joissa jokainen "luku" on tietokonesana: kahdessa tai kahdessa bitissä leveä kahdessa esimerkissä. Kun kaksi tällaista numeroa lisätään, se on täsmälleen sama prosessi: lisää kaksi "numeroa", tallenna tulos ja kuljeta ylivuoto. Erona on, että jokainen luku edustaa arvoa välillä 0 ja 2 ^ 8 (8-bittiselle prosessorille) tai arvoa 0 ja 2 ^ 32 (32-bittiselle prosessorille). Jos ajattelet mukavasti numeropohjien suhteen, kynän ja paperin lisäys toimii tukikohdassa 10 ja korkean tarkkuuden tietokoneiden lisäys toimii kannassa 2 ^ 8 tai 2 ^ 32 (tai mikä tahansa muu sopii parhaiten prosessorille).



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...