INHOUDSOPGAWE:

Kodeer en toets 'n rekenaar in masjientaal: 6 stappe
Kodeer en toets 'n rekenaar in masjientaal: 6 stappe

Video: Kodeer en toets 'n rekenaar in masjientaal: 6 stappe

Video: Kodeer en toets 'n rekenaar in masjientaal: 6 stappe
Video: Top 5 voorgeïnstalleerde handige Windows 10 programma's 2024, November
Anonim
Image
Image

In hierdie instruksies sal ek jou wys hoe om 'n rekenaarprogram in masjientaal te kodeer en te toets. Masjientaal is die moedertaal van rekenaars. Omdat dit bestaan uit snare van 1s en 0s, word dit nie maklik deur mense verstaan nie. Om dit te vermy, kodeer ons programme eers in 'n hoëvlak taal, soos C ++ of Java, en gebruik dan spesiale rekenaarprogramme om dit te vertaal in die 1's en 0's wat rekenaars verstaan. Om te leer om in 'n hoëvlak taal te kodeer, is beslis 'n goeie idee, maar 'n kort inleiding tot masjientaal kan waardevolle insigte gee oor hoe rekenaars werk en die waardering vir hierdie baie belangrike tegnologie verhoog.

Om 'n masjientaalprogram te kodeer en te toets, benodig ons toegang tot 'n rekenaar sonder probleme, waarvan die masjientaal maklik verstaanbaar is. Persoonlike rekenaars is veels te kompleks om selfs te oorweeg. Die oplossing is om Logisim, 'n logiese simulator, te gebruik wat op 'n persoonlike rekenaar werk. Met Logisim kan ons 'n rekenaar simuleer wat aan ons behoeftes voldoen. Die video hierbo gee u 'n idee wat ons met Logisim kan bereik.

Vir die rekenaarontwerp het ek een aangepas uit my Kindle -e -boek Build Your Own Computer - From Scratch. Ek het begin met die BYOC-rekenaar wat daar beskryf word en dit afgesny tot die verskillende basiese BYOC-I (I for Instructable) wat ons in hierdie Instructable sal gebruik.

BYOC-I se masjientaal is eenvoudig en maklik om te verstaan. U het geen spesiale kennis van rekenaars of programmering nodig nie. Al wat nodig is, is 'n nuuskierige verstand en begeerte om te leer

Verdere leeswerk

U wonder miskien waarom ons 'masjien' gebruik om 'n rekenaar te beskryf as dit nie 'n meganiese toestel is nie. Die rede is histories; die eerste rekenaars was meganies bestaande uit ratte en wiele. Die liriek van Allan Sherman, "Dit het alles geknak …" was eers 'n eeu of twee. Lees hier meer oor vroeë rekenaars.

Stap 1: Onderdele lys

Masjientaalhiërargie en kodes
Masjientaalhiërargie en kodes

Die onderdele lys is kort. Slegs hierdie twee items is nodig, albei gratis af te laai:

  1. "Logisim-win-2.7.1.exe"-Logisim is 'n gewilde en maklik om te gebruik logiese simulator. Laai die uitvoerbare lêer van Logisim van hier af af, en skep dan 'n kortpad op 'n gerieflike plek soos u tafelblad. Dubbelklik op die Logisim -ikoon om dit te begin. Nota: Logisim gebruik Java Runtime -pakket wat hier geleë is. U kan gevra word om dit af te laai.
  2. BYOC-I-Full.cir "-Laai die Logisim-kringlêer hieronder af.

Begin Logisim, klik dan op "File-Open" en laai die BYOC-I-Full.cir-lêer. Die prent hierbo toon die Logisim -werksomgewing. Die BYOC-I word voorgestel deur die subkringblok. Ekstern is twee insette, Reset en Run, en heksadesimale skerms vir die BYOC-I se registers en programgeheue verbind.

Die programgeheue van die BYOC-I is vooraf gelaai met 'n eenvoudige program wat van 1 tot 5 in die A-register tel. Volg die volgende stappe om die program uit te voer (Run).

Stap 1 - Klik op die Poke Tool. Die wyser moet verander na die steekende "vinger". Stap 2 - Steek die Reset -invoer twee keer, verander dit een keer na "1" en verander dit weer na "0". Dit stel die BYOC -I terug om die program te begin by adres 0. Stap 3 - Maak een keer die uitvoer -invoer om dit na "1" te verander. Die A -register moet die telling wys wat van 1 na 5 verander en dan herhaal. Stap 4 - As die program nie uitgevoer word nie, druk op control -K en dit moet begin.

As u die vermoëns van Logisim wil ondersoek, klik op die hulpskakel in die menubalk. Van daar af kan u die Logisim "Tutoriaal", "Gebruikersgids" en "Biblioteekverwysing" verken. Hier vind u 'n uitstekende video -inleiding.

Stap 2: Masjientaalhiërargie en kodes

Masjientaalhiërargie en kodes
Masjientaalhiërargie en kodes

Die BYOC-I-rekenaar verrig take wat gebaseer is op programme wat in masjientaal geskryf is. BYOC-I-programme bestaan op hul beurt uit instruksies wat in 'n goed gedefinieerde volgorde uitgevoer word. Elke instruksie bestaan uit kodes met vaste lengte wat verskillende operasionele komponente van die BYOC-I voorstel. Laastens bestaan hierdie kodes uit stringe van 1s en 0s wat die masjientaal vorm wat die BYOC-I eintlik uitvoer.

Ter verduideliking, ons begin met kodes en werk tot op programvlak. Dan kodeer ons 'n eenvoudige program, laai dit in die geheue van die BYOC-I en voer dit uit.

Kodes bestaan kortliks uit 'n vaste aantal binêre (1 en 0) syfers of bisse. Die onderstaande tabel toon byvoorbeeld al die moontlike kodes (altesaam 16) vir 'n kode van 4 bisse breed. Die kode langs die kode is die heksadesimale (basis 16) en desimale ekwivalent. Heksadesimaal word gebruik om na binêre waardes te verwys, aangesien dit meer kompak is as binêre en makliker om te skakel van binêre as desimaal. Met die voorvoegsel "0x" kan u weet dat die getal wat volg, heksadesimaal is of kortweg "heks".

Binêr - Heksadesimaal - Desimaal0000 0x0000 00001 0x0001 10010 0x0002 20011 0x0003 30100 0x0004 40101 0x0005 50111 0x0007 71000 0x0008 81001 0x0009 91010 0x000A 101011 0x000B 111100 0x000C 121101 0x000D 131110 0x000D 131110

Die breedte van 'n kode bepaal hoeveel items voorgestel kan word. Soos opgemerk, kan die 4-bis wye kode hierbo tot 16 items verteenwoordig (0 tot 15); dit wil sê 2 maal 2 vier keer geneem of 2 tot 4de krag is gelyk aan 16. In die algemeen word die aantal verteenwoordigbare items 2 na die nde krag verhoog. Hier is 'n kort lys van n-bis-kode-kapasiteite.

n - Aantal items 1 22 43 84 165 326 647 1288 256

BYOC-I rekenaarkode breedtes word gekies om die aantal items wat deur die kode voorgestel moet word, te akkommodeer. Daar is byvoorbeeld vier instruksiesoorte, dus 'n 2-bis wye kode is geskik. Hier is die BYOC-I-kodes met 'n kort uiteensetting van elk.

Instruksietipe kode (tt) Daar is vier tipes instruksies: (1) MVI - Skuif 'n onmiddellike 8 -bis konstante waarde na 'n geheue register. Die geheue register is 'n toestel wat data bevat wat gebruik moet word vir 'n berekening, (2) MOV - Skuif data van een register na 'n ander, (3) RRC - Voer 'n register -tot -register berekening uit, en (4) JMP - Spring na 'n ander instruksie in plaas van om voort te gaan met die volgende instruksie. Die BYOC-I-instruksietipe kodes is soos volg:

00 MVI01 MOV10 RRC11 JMP

Registerkode (dd en ss) Die BYOC-I het vier 8-bis-registers wat waardes van 0 tot 255 kan stoor. 'N 2-bis-kode is voldoende om die vier registers aan te dui:

00 F register01 E register10 D register11 A register

Berekeningskode (ccc) Die BYOC-I ondersteun vier rekenkundige/logiese bewerkings. 'N 3-bis-kode word gebruik om toekomstige uitbreiding na agt berekeninge moontlik te maak:

000 ADD, voeg twee 8-bis waardes by in aangewese registers en stoor die resultaat in een van die registers 001 SUB, trek twee 8-bis waardes af in aangewese registers en stoor die resultaat in een van die registers 010-011 Gereserveer vir toekomstige gebruik100 EN, logies EN twee 8-bis waardes in aangewese registers en stoor die resultaat in een van die registers101 OF, logies OF twee 8-bis waardes in aangewese registers en stoor die resultaat in een van die registers110 tot 111, Gereserveer vir toekomstige gebruik

Springkode (j) 'n 1-bis kode wat aandui of die sprong onvoorwaardelik is (j = 1) of gekondisioneer is met 'n nie-nul berekening resultaat (j = 0).

Data-/adreskode (v… v)/(a… a) 8-bis-data kan ingesluit word in sekere instruksies wat waardes van 00000000 tot 11111111 of 0 tot 255 desimale voorstel. Hierdie data is 8-bis breed vir berging in BYOC-I se 8-bis-registers. Met desimale rekenkunde vertoon ons nie vooraanstaande nulle nie. Met rekenaarrekenkunde toon ons vooraanstaande nulle, maar dit beïnvloed nie die waarde nie. 00000101 is numeries dieselfde as 101 of 5 desimaal.

Voorgestelde verwysings

Binêre notasie - https://learn.sparkfun.com/tutorials/binaryHexadecimal notation -

Verdere leeswerk

Die idee om kodes te gebruik om 'n proses aan te dryf, is ver terug. Een boeiende voorbeeld is die Jacquard Loom. Die outomatiese weefstoel word beheer deur 'n ketting houtkaarte waarin gate geboor is wat kodes vir verskillende kleure gare vir weef verteenwoordig. Ek het my eerste een in Skotland gesien waar dit gebruik is om kleurvolle tartans te maak. Lees hier meer oor Jacquard Looms.

Stap 3: Anatomie van BYOC-I-instruksies

Anatomie van BYOC-I-instruksies
Anatomie van BYOC-I-instruksies

Gegewe die kodes van BYOC-I, gaan ons na die volgende vlak, instruksies. Om 'n instruksie vir die BYOC-I te skep, plaas ons die kodes saam in 'n spesifieke volgorde en op spesifieke plekke binne die instruksie. Nie alle kodes verskyn in alle instruksies nie, maar as dit wel gebeur, neem dit 'n spesifieke plek in.

Die MVI -instruksietipe benodig die meeste stukkies, 12 in totaal. Deur die instruksiewoord 12 stukkies lank te maak, kan ons alle instruksies akkommodeer. Ongebruikte (sogenaamde "gee nie om nie") stukkies kry die waarde 0. Hier is die BYOC-I instruksieset.

  1. Beweeg onmiddellik (MVI) - 00 dd vvvvvvvvFunction: Skuif 'n 8 -bis data waarde V = vvvvvvvv na die bestemmingsregister dd. Na die uitvoering sal die register dd die waarde vvvvvvv hê. Afkorting: MVI R, V waar R is A, D, E of F. Voorbeeld: 00 10 00000101 - MVI D, 5 - Skuif die waarde 5 na die D -register.
  2. Skuif Register na Register (MOV) - 01 dd ss 000000Funksie: Skuif data van bronregister ss na desination register dd. Na uitvoering het beide registers dieselfde waarde as die bronregister. Afkorting: MOV Rd, Rs waar Rd die bestemmingsregister A, D, E of F is en Rs is die bronregister A, D, E of F. Voorbeeld: 01 11 01 000000 - MOV A, E - Skuif die waarde in register E om A.
  3. Registreer om berekening te registreer (RRC) - 10 dd ss ccc 000 Funksie: Voer aangewese berekening ccc uit met behulp van bronregister ss en bestemmingsregister dd en stoor dan die resultaat in die bestemmingsregister. Rd); SUB Rd, Rs (ccc = 001 Rd - Rs gestoor in Rd); EN Rd, Rs (ccc = 100 Rd EN R's wat in Rd gestoor is); OF Rd, Rs (ccc = 101 Rd OF Rs gestoor in Rd). Voorbeeld: 10 00 11 001 000 - SUB F, A - Trek die waarde in die A -register af van die F -register met die resultaat in die F -register.
  4. Spring na verskillende instruksies (JMP) - 11 j 0 aaaaaaaa Funksie: Verander uitvoering na 'n ander instruksie wat op adres aaaa aaaa geleë is (a) Onvoorwaardelik (j = 1) -11 1 0 aaaaaaaa Afkorting: JMP L waar L adres aaaa aaaa Voorbeeld is: 11 1 0 00001000 - JMP 8 - Verander uitvoering na adres 8. (b) Voorwaardelik (j = 0) toe die vorige berekening 'n nie -nul resultaat tot gevolg het - 11 0 0 aaaaaaaa Afkorting: JNZ L waar L adres aaaa aaaa is Voorbeeld: 11 0 0 00000100 JNZ 4 As die laaste berekening 'n waarde van nul lewer, verander die uitvoering na adres 4.

Instruksiewoorde word van 11 tot 0. van links na links (die belangrikste bit MSB) na regs (minste betekenisvolle LSB) genommer. Die vaste volgorde en ligging van die kodes is soos volg:

Bits-Kode11-10 Instruksietipe9-8 Bestemmingsregister7-6 Bronregister5-3 Berekening: 000-voeg by; 001 - aftrek; 100 - logies EN; 101 - logiese OR7-0 Konstante waarde v… v en a… a (0 tot 255)

Die instruksieset word saamgevat in die figuur hierbo. Let op die gestruktureerde en ordelike voorkoms van die kodes in elke instruksie. Die resultaat is 'n eenvoudiger ontwerp vir die BYOC-I en dit maak instruksies makliker vir die mens om dit te verstaan.

Stap 4: Kodering van 'n rekenaarinstruksie

Kodering van 'n rekenaarinstruksie
Kodering van 'n rekenaarinstruksie

Voordat ons na die programvlak gaan, moet ons 'n paar voorbeeldinstruksies saamstel met behulp van die BYOC-I-instruksies hierbo.

1. Skuif die waarde 1 na register A. BYOC-I-registers kan waardes van 0 tot 255 stoor. In hierdie geval sal register A die waarde 1 (00000001 binêre) hê nadat die instruksie uitgevoer is.

Afkorting: MVI A, 1Kodes benodig: Tipe MVI - 00; Bestemmingsregister A - 11; Waarde - 00000001Instruksiewoord: 00 11 00000001

2. Skuif die inhoud van register A na register D. Na uitvoering, het beide registers die oorspronklike waarde in register A.

Afkorting: MOV D, A (Onthou, die bestemming is eerste en bron tweede in die lys) Kodes benodig: Tik MOV - 01; Bestemmingsregister D - 10; Bronregister A - 11Instruksiewoord: 01 10 11 000000

3. Voeg inhoud van register D by register A en stoor in register A. Na uitvoering is die waarde van register A die som van die oorspronklike waarde van register A en register D.

Afkorting: ADD A, D (Resultaat word in bestemmingsregister gestoor) Kodes benodig: Tik RRC - 10; Bestemmingsregister A - 11; Bronregister D - 10; Berekening byvoeg - 000Instruksiewoord: 10 11 10 000 000 (ccc is eerste 000 - voeg by)

4. Spring op nie nul na adres 3. As die resultaat van die laaste berekening nie nul was nie, verander die uitvoering na die instruksie op die gegewe adres. As dit nul is, word die uitvoering hervat volgens die instruksies hieronder.

Afkorting: JNZ 3Kodes benodig: Tipe JMP - 11; Springtipe - 0; Adres - 00000003Instruksiewoord: 11 0 0 00000003 (Springtipe is eerste 0)

5. Spring onvoorwaardelik na adres 0. Na uitvoering verander die uitvoering van die instruksie op die gegewe adres.

Afkorting: JMP 0Kode benodig: Tipe JMP - 11; Springtipe - 1; Adres - 00000000Instruksiewoord; 11 1 0 00000000

Alhoewel masjienkodering ietwat vervelig is, kan u sien dat dit nie onmoontlik moeilik is nie. As u werklik met die masjien gekodeer het, sou u 'n rekenaarprogram met die naam assembler gebruik om van die afkorting (wat samestellingskode genoem word) na masjienkode te vertaal.

Stap 5: Anatomie van 'n rekenaarprogram

Anatomie van 'n rekenaarprogram
Anatomie van 'n rekenaarprogram

'N Rekenaarprogram is 'n lys instruksies wat die rekenaar begin, aan die begin van die lys, tot aan die einde van die lys. Instruksies soos JNZ en JMP kan verander watter instruksie daarna uitgevoer word. Elke instruksie in die lys beslaan 'n enkele adres in die rekenaar se geheue vanaf 0. Die BYOC-I-geheue kan 'n lys van 256 instruksies bevat, meer as genoeg vir ons doeleindes.

Rekenaarprogramme is ontwerp om 'n gegewe taak uit te voer. Vir ons program kies ons 'n eenvoudige taak, van 1 tot 5. Dit is duidelik dat daar geen 'tel'-instruksie is nie, dus is die eerste stap om die taak op te deel in stappe wat deur die BYOC-I's hanteer kan word beperkte instruksieset.

Stap 1 Skuif 1 om AStep te registreer 2 Skuif register A om te registreer DStep 3 Voeg register D by om A te registreer en stoor die resultaat in register AStep 4 Skuif 5 om EStep 5 te registreer Trek register A af van register E en stoor die resultaat in register EStep 6 As die aftrekresultaat was nie nul nie, gaan terug na Stap 4 en gaan voort met tel 7 As die aftrekresultaat nul was, gaan terug en begin weer

Die volgende stap is om hierdie stappe te vertaal in BYOC-I instruksies. BYOC-I programme begin by adres 0 en nommer agtereenvolgens. Spring -teikenadresse word laaste bygevoeg nadat alle instruksies in plek is..

Adres: Instruksie - Afkorting; Beskrywing0: 00 11 00000001 - MVI A, 1; Skuif 1 om te registreer A1: 01 10 11 000000 - MOV D, A; Skuif register A om te registreer D2: 10 11 10 000 000 - ADD A, D; Voeg register D by register A en stoor die resultaat in register A3: 00 01 00 00000101 - MVI E, 5; Beweeg 5 register E4: 10 01 11 001 000 - SUB E, A; Trek register A af van register E en stoor die resultaat in register E5: 11 0 0 00000010 - JNZ 2; As die aftrekresultaat nie nul was nie, gaan terug na adres 3 en tel verder 6: 11 1 0 00000000 - JMP 0; As die aftrekresultaat nul was, gaan terug en begin weer

Voordat die program na die geheue oorgedra word, moet die binêre instruksiekode na heksadesimaal verander word om saam met die Logisim Hex Editor te gebruik. Verdeel eers die instruksie in drie groepe van 4 bisse elk. Vertaal dan die groepe in heksadesimaal met behulp van die tabel in stap 2. Slegs die laaste drie heksadesimale syfers (vetgedruk hieronder) sal gebruik word.

Adres - Instruksie Binêr - Instruksie Binêre Split - Instruksie (Hex) 0 001100000001 0011 0000 0001 - 0x03011 011011000000 0110 1100 0000 - 0x06C02 101110000000 1011 1000 0000 - 0x0B803 000100000101 0001 0000 0101 - 0x01054 100111001000 10000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00000 111000000010 1110 0000 0000 - 0x0E00

Dit is tyd om die program na die BYOC-I se geheue oor te dra vir toetsing.

Stap 6: Die oordrag van die program na geheue en toetsing

Die oordrag van die program na geheue en toetsing
Die oordrag van die program na geheue en toetsing
Die oordrag van die program na geheue en toetsing
Die oordrag van die program na geheue en toetsing

As u na die "hoof" kring van Logisim kyk, is die getoonde BYOC-I-blok die simbool van die werklike rekenaarsirkel met die naam "BYOC-I" in die Explorer-venster. Om 'n program in die BYOC-I-geheue in te voer:

  1. Klik met die rechtermuisknop op die BYOC-I-blok ('subkring' genoem) en kies (Beweeg met die linkermuisknop) 'View BYOC-I'.
  2. Die BYOC-I-kring sal in die werkarea verskyn. Klik met die rechtermuisknop op die "Programgeheue" -simbool en kies "Inhoud wysig..".
  3. Voer die heksadesimale kode (slegs vetdruk) in soos hierbo getoon, met behulp van die Logisim Hex Editor.

U is nou gereed om die program uit te voer. Keer terug na die hoofkring deur te dubbelklik op "BYOC-I" in die verkennervenster. Die uitvoer- en herstel -insette moet "0" wees om te begin. Met die Poke Tool, verander eers Herstel na "1" en dan terug na "0". Dit maak die beginadres 0x0000 en berei die BYOC-I-stroombaan voor vir uitvoering. Skakel nou die uitvoer -invoer na "1" en die program sal uitgevoer word. (Let wel: u moet eers op Control-K tik om die Logisim-klok te begin. Dit is 'n funksie waarmee u die Logisim-klok kan stop en deur 'n program kan gaan deur herhaaldelik op Control-T te tik. Probeer dit een of ander tyd!)

Die Logisim -klok is instelbaar vir 'n wye reeks frekwensies. Soos afgelaai, is dit 8 Hz (8 siklusse per sekonde). Soos die BYOC-I-rekenaar ontwerp is, neem elke instruksie vier kloksiklusse. Dus, om die BYOC-I-snelheid te bereken, deel die klokfrekwensie met 4. By 8 Hz is die snelheid 2 instruksies per sekonde. U kan die klok verander deur op die werkbalk op "Simuleer" te klik en "Merkfrekwensie" te kies. Die moontlike omvang is 0,25 Hz tot 4100 Hz. Die stadige snelheid by 8 Hz is gekies sodat u die telling in die A -register kon sien.

Die maksimum spoed van die BYOC-I-simulasie (~ 1000 instruksies per sekonde) is baie stadig in vergelyking met moderne rekenaars. Die hardeware -weergawe van die BYOC -rekenaar wat in my boek beskryf word, voer meer as 12 miljoen instruksies per sekonde uit!

Ek hoop dat hierdie Instructable die taalprogrammering van masjiene geïntimaliseer het en u insig gegee het oor hoe rekenaars op hul mees basiese vlak werk. Om u begrip te beklemtoon, probeer om die twee programme hieronder te kodeer.

  1. Skryf 'n program wat begin by 5 en aftel tot 0. (ANS. Count5to0.txt hieronder)
  2. Begin by 2, tel met 3 totdat die getal meer as 7. U kan 'n bietjie hoofrekene doen, kyk of 8 weet dat dit daar sou beland en begin dan weer. Skryf u program op 'n meer algemene manier wat werklik toets of die getal 'n spesifieke getal "oorskry". Wenk: Ontdek wat gebeur as 'n aftrekking 'n negatiewe waarde oplewer, byvoorbeeld 8 - 9 = -1. Eksperimenteer dan met die logiese EN om te toets of die MSB in 'n 8-bis getal "1" is. (ANS. ExceedsCount.txt)

Kan u aan ander uitdagende probleme dink vir die BYOC-I-rekenaar? Gegewe die beperkinge, wat meer kan dit doen? Deel u ervarings met my by [email protected]. As u belangstel in die kodering van mikroverwerkers, besoek my webwerf www.whippleway.com. Daar dra ek masjienkodering na moderne verwerkers soos die ATMEL Mega -reeks wat in Arduinos gebruik word.

Aanbeveel: