Innholdsfortegnelse:

Kode og test en datamaskin på maskinspråk: 6 trinn
Kode og test en datamaskin på maskinspråk: 6 trinn

Video: Kode og test en datamaskin på maskinspråk: 6 trinn

Video: Kode og test en datamaskin på maskinspråk: 6 trinn
Video: CS50 Live, Эпизод 001 2024, November
Anonim
Image
Image

I denne instruksen vil jeg vise deg hvordan du koder og tester et dataprogram på maskinspråk. Maskinspråk er morsmål for datamaskiner. Fordi den består av strenger på 1 og 0, er den ikke lett å forstå av mennesker. For å omgå dette, koder vi programmer først på et språk på høyt nivå som C ++ eller Java, og bruker deretter spesielle dataprogrammer for å oversette dem til 1'er og 0'er datamaskiner forstår. Å lære å kode på et språk på høyt nivå er absolutt ingen idé, men en kort introduksjon til maskinspråk kan gi verdifull innsikt i hvordan datamaskiner fungerer og øke forståelsen for denne svært viktige teknologien.

For å kode og teste et maskinspråkprogram, trenger vi tilgang til en datamaskin uten problemer som er lett å forstå. Personlige datamaskiner er altfor komplekse til å tenke på. Løsningen er å bruke Logisim, en logisk simulator, som kjører på en personlig datamaskin. Med Logisim kan vi simulere en datamaskin som dekker våre behov. Videoen ovenfor gir deg en ide om hva vi kan oppnå med Logisim.

For datamaskindesignet tilpasset jeg en fra min Kindle -e -bok Build Your Own Computer - From Scratch. Jeg begynte med BYOC-datamaskinen beskrevet der og trimmet den ned til den varierende grunnleggende BYOC-I (I for instruerbare) vi vil bruke i denne instruksjonsboken.

BYOC-I's maskinspråk er enkelt og lett å forstå. Du trenger ingen spesiell kunnskap om datamaskiner eller programmering. Alt som kreves er et nysgjerrig sinn og lyst til å lære

Videre lesning

Du lurer kanskje på hvorfor vi bruker "maskin" til å beskrive en datamaskin når den ikke er en mekanisk enhet. Årsaken er historisk; de første dataenhetene var mekaniske bestående av tannhjul og hjul. Allan Shermans tekst, "Det var alle tannhjul som gikk klikkende …" var bare et århundre eller to. Les mer om tidlig databehandling her.

Trinn 1: Deleliste

Hierarki og koder for maskinspråk
Hierarki og koder for maskinspråk

Delelisten er kort. Bare disse to elementene kreves, begge kan lastes ned gratis:

  1. "Logisim-win-2.7.1.exe"-Logisim er en populær og brukervennlig logisk simulator. Last ned den kjørbare filen Logisim herfra, og lag deretter en snarvei på et praktisk sted som skrivebordet ditt. Dobbeltklikk på Logisim -ikonet for å starte det. Merk: Logisim bruker Java Runtime Package som ligger her. Du kan bli bedt om å laste den ned.
  2. BYOC-I-Full.cir "-Last ned Logisim-kretsfilen nedenfor.

Start Logisim, klikk deretter på "File-Open" og last inn BYOC-I-Full.cir-filen. Bildet over viser Logisim -arbeidsmiljøet. BYOC-I er representert av subkretsblokken. Eksternt koblet er to innganger, Reset and Run, og heksadesimale skjermer for BYOC-I's registre og programminne.

BYOC-I's programminne er forhåndslastet med et enkelt program som teller fra 1 til 5 i A-registeret. Følg disse trinnene for å utføre (Kjør) programmet.

Trinn 1 - Klikk på Poke Tool. Markøren skal skifte til "fingeren" som stikker. Trinn 2 - Poke Reset -inngangen to ganger, en gang endret den til "1" og igjen for å endre den tilbake til "0". Dette tilbakestiller BYOC -I for å starte programmet på adresse 0. Trinn 3 - Poke Run -inngangen en gang for å endre den til "1". A -registeret skal vise tellingen som endres fra 1 til 5 og deretter gjenta. Trinn 4 - Hvis programmet ikke kjøres, trykker du på control -K og det skal starte.

Hvis du vil utforske Logisims evner, klikker du på Hjelp -koblingen i menylinjen. Derfra kan du utforske Logisim "Tutorial", "User Guide" og "Library Reference". En utmerket videoinnføring finnes her.

Trinn 2: Hierarki og koder for maskinspråk

Hierarki og koder for maskinspråk
Hierarki og koder for maskinspråk

BYOC-I-datamaskinen utfører oppgaver basert på programmer skrevet på maskinspråk. BYOC-I-programmer består på sin side av instruksjoner utført i en veldefinert sekvens. Hver instruksjon er laget av koder med fast lengde som representerer forskjellige operasjonelle komponenter i BYOC-I. Til slutt består disse kodene av strenger på 1 og 0 som utgjør maskinspråket BYOC-I faktisk utfører.

For å forklare, starter vi med koder og jobber oss opp til programnivå. Deretter vil vi kode et enkelt program, laste det inn i BYOC-I-minnet og kjøre det.

Koder består av et fast antall binære (1 og 0) sifre eller biter, for kort. For eksempel viser tabellen nedenfor alle mulige koder (16 totalt) for en kode på 4 bits bred. Vist langs siden er koden heksadesimal (base 16) og desimalekvivalent. Heksadesimal brukes for å referere til binære verdier, da den er mer kompakt enn binær og lettere å konvertere fra binær enn desimal. "0x" -prefikset lar deg vite tallet som følger er heksadesimalt eller "heks" for kort.

Binær - Heksadesimal - Desimal0000 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

Bredden på en kode bestemmer hvor mange elementer som kan representeres. Som nevnt kan 4-bits bred kode ovenfor representere opptil 16 elementer (0 til 15); det vil si 2 ganger 2 tatt fire ganger eller 2 til 4. effekt er lik 16. Generelt sett er antallet representable items 2 hevet til nth power. Her er en kort liste over n-bit kodekapasiteter.

n - Antall varer 1 22 43 84 165 326 647 1288 256

BYOC-I datakodebredder er valgt for å imøtekomme antallet elementer som skal representeres av koden. For eksempel er det fire instruksjonstyper, så en 2-bits bred kode er egnet. Her er BYOC-I-kodene med en kort forklaring av hver.

Instruksjonstype kode (tt) Det er fire instruksjonstyper: (1) MVI - Flytt en umiddelbar 8 -biters konstant verdi til et minnesregister. Minneregisteret er en enhet som inneholder data som skal brukes til en beregning, (2) MOV - Flytt data fra et register til et annet, (3) RRC - Utfør en register -til -register -beregning, og (4) JMP - Jump til en annen instruksjon i stedet for å fortsette med neste instruksjon. BYOC-I-instruksjonstypekodene er som følger:

00 MVI01 MOV10 RRC11 JMP

Registerkode (dd og ss) BYOC-I har fire 8-biters registre som kan lagre verdier fra 0 til 255. En 2-biters kode er tilstrekkelig for å angi de fire registerene:

00 F register01 E register10 D register11 A register

Beregningskode (ccc) BYOC-I støtter fire aritmetiske/logiske operasjoner. For å tillate fremtidig utvidelse til åtte beregninger, brukes en 3-biters kode:

000 ADD, legg til to 8-biters verdier i angitte registre og lagre resultatet i et av registerene 001 SUB, trekk fra to 8-biters verdier i angitte registre og lagre resultatet i et av registerene 010-011 Reservert for fremtidig bruk100 OG, logisk OG to 8-biters verdier i angitte registre og lagre resultatet i et av registerene101 ELLER, logisk ELLER to 8-biters verdier i angitte registre og lagre resultatet i et av registerene110 til 111, Reservert for fremtidig bruk

Hoppekode (j) En 1-bits kode som angir om hoppet er ubetinget (j = 1) eller betinget av et ikke-null beregningsresultat (j = 0).

Data/adressekode (v… v)/(a… a) 8-biters data kan inkluderes i visse instruksjoner som representerer verdier fra 00000000 til 11111111 eller 0 til 255 desimaler. Disse dataene er 8-bits brede for lagring i BYOC-I's 8-biters registre. Med desimalregning viser vi ikke ledende nuller. Med dataritmetikk viser vi ledende nuller, men de påvirker ikke verdien. 00000101 er numerisk det samme med 101 eller 5 desimaler.

Foreslåtte referanser

Binær notasjon - https://learn.sparkfun.com/tutorials/binaryHexadecimal Notation -

Videre lesning

Ideen om å bruke koder for å drive en prosess går langt tilbake. Et fascinerende eksempel er Jacquard Loom. Den automatiserte veven ble kontrollert av en kjede av trekort der det ble boret hull som representerer koder for garn i forskjellige farger for veving. Jeg så min første i Skottland hvor den ble brukt til å lage fargerike tartaner. Les mer om Jacquard Looms her.

Trinn 3: Anatomi av BYOC-I instruksjoner

Anatomi av BYOC-I instruksjoner
Anatomi av BYOC-I instruksjoner

Gitt BYOC-I's koder, går vi opp til neste nivå, instruksjoner. For å lage en instruksjon for BYOC-I, plasserer vi kodene sammen i spesifisert rekkefølge og på bestemte steder i instruksjonen. Ikke alle koder vises i alle instruksjoner, men når de gjør det, inntar de et bestemt sted.

MVI -instruksjonstypen krever flest biter, 12 totalt. Ved å lage instruksjonsordet til 12 bits i lengden, tar vi imot alle instruksjonene. Ubrukte (såkalte "don't care") biter får verdien 0. Her er BYOC-I instruksjonssett.

  1. Move Immediate (MVI) - 00 dd vvvvvvvvFunksjon: Flytt en 8 -biters dataverdi V = vvvvvvvv til destinasjonsregisteret dd. Etter utførelse vil register dd ha verdien vvvvvvvv. Forkortelse: MVI R, V hvor R er A, D, E eller F. Eksempel: 00 10 00000101 - MVI D, 5 - Flytt verdien 5 til D -registeret.
  2. Flytt register til register (MOV) - 01 dd ss 000000Funksjon: Flytt data fra kilderegister ss til desinationsregister dd. Etter utførelse har begge registerene samme verdi som kilderegisteret. Forkortelse: MOV Rd, Rs der Rd er destinasjonsregisteret A, D, E eller F og Rs er kilderegisteret A, D, E eller F. Eksempel: 01 11 01 000000 - MOV A, E - Flytt verdien i register E for å registrere A.
  3. Registrer for å registrere beregning (RRC) - 10 dd ss ccc 000Funksjon: Utfør beregnet ccc ved hjelp av kilderegister ss og destinasjonsregister dd og lagre deretter resultatet i destinasjonsregisteret. Forkortelser: ADD Rd, Rs (ccc = 000 Rd + Rs lagret i Rd); SUB Rd, Rs (ccc = 001 Rd - Rs lagret i Rd); AND Rd, Rs (ccc = 100 Rd AND Rs lagret i Rd); ELLER Rd, Rs (ccc = 101 Rd ELLER Rs lagret i Rd). Eksempel: 10 00 11 001 000 - SUB F, A - Trekk verdien i A -registeret fra F -registeret med resultatet i F -registeret.
  4. Hopp til annen instruksjon (JMP) - 11 j 0 aaaaaaaaFunksjon: Endre utførelse til en annen instruksjon som ligger på adressen aaaa aaaa (a) Ubetinget (j = 1) -11 1 0 aaaaaaaa Forkortelse: JMP L hvor L er adresse aaaa aaaa Eksempel: 11 1 0 00001000 - JMP 8 - Endre utførelse til adresse 8. (b) Betinget (j = 0) når den forrige beregningen resulterte i et ikke null resultat - 11 0 0 aaaaaaaa Forkortelse: JNZ L hvor L er adresse aaaa aaaa. Eksempel: 11 0 0 00000100 JNZ 4 Hvis den siste beregningen ga en verdi som ikke er null, endrer du utførelsen til adresse 4.

Instruksjonsordbiter er nummerert til venstre (mest betydningsfulle bit MSB) til høyre (minst signifikante bit LSB) fra 11 til 0. Den faste rekkefølgen og plasseringene til kodene er som følger:

Bits-Code11-10 Instruction Type9-8 Destinationsregister7-6 Kilderegister5-3 Beregning: 000-legg til; 001 - trekk fra; 100 - logisk OG; 101 - logisk OR7-0 Konstant verdi v… v og a… a (0 til 255)

Instruksjonssettet er oppsummert i figuren ovenfor. Legg merke til det strukturerte og ryddige utseendet til kodene i hver instruksjon. Resultatet er en enklere design for BYOC-I, og det gjør instruksjoner lettere for mennesker å forstå.

Trinn 4: Koding av en datamaskininstruksjon

Koding av en datamaskininstruksjon
Koding av en datamaskininstruksjon

Før vi går til programnivå, la oss konstruere noen eksempler på instruksjoner ved hjelp av BYOC-I instruksjonssett ovenfor.

1. Flytt verdien 1 for å registrere A. BYOC-I-registre kan lagre verdier fra 0 til 255. I dette tilfellet vil register A ha verdien 1 (00000001 binær) etter at instruksjonen er utført.

Forkortelse: MVI A, 1Koder som kreves: Type MVI - 00; Destinasjonsregister A - 11; Verdi - 00000001Instruksjonsord: 00 11 00000001

2. Flytt innholdet i register A til register D. Etter utførelse vil begge registrene ha verdien opprinnelig i register A.

Forkortelse: MOV D, A (Husk, destinasjonen er først og kilden andre i listen) Koder som kreves: Skriv MOV - 01; Destinasjonsregister D - 10; Kilderegister A - 11Instruksjonsord: 01 10 11 000000

3. Legg til innholdet i register D for å registrere A og lagre i register A. Etter utførelsen vil verdien til register A være summen av den opprinnelige verdien av register A og register D.

Forkortelse: ADD A, D (Resultatet er lagret i destinasjonsregisteret) Koder som kreves: Type RRC - 10; Destinasjonsregister A - 11; Kilderegister D - 10; Beregning Legg til - 000Instruksjonsord: 10 11 10 000 000 (ccc er første 000 - legg til)

4. Hopp på ikke null til adresse 3. Hvis resultatet av den siste beregningen ikke var null, vil utførelsen endres til instruksjonen på den gitte adressen. Hvis null, fortsetter utførelsen etter instruksjonene som følger.

Forkortelse: JNZ 3Koder påkrevd: Type JMP - 11; Hoppetype - 0; Adresse - 00000003Instruksjonsord: 11 0 0 00000003 (Hoppetype er første 0)

5. Hopp ubetinget til adresse 0. Etter henrettelse endres utførelsen i instruksjonen på den gitte adressen.

Forkortelse: JMP 0Kode påkrevd: Type JMP - 11; Hoppetype - 1; Adresse - 00000000Instruksjonsord; 11 1 0 00000000

Selv om maskinkoding er litt kjedelig, kan du se at det ikke er umulig vanskelig. Hvis du var maskinkoding på ekte, ville du bruke et dataprogram kalt en assembler for å oversette fra forkortelsen (som kalles monteringskode) til maskinkode.

Trinn 5: Anatomi av et dataprogram

Anatomi av et dataprogram
Anatomi av et dataprogram

Et dataprogram er en liste over instruksjoner som datamaskinen utfører fra begynnelsen av listen og fortsetter nedover til slutten. Instruksjoner som JNZ og JMP kan endre hvilken instruksjon som utføres neste. Hver instruksjon i listen opptar en enkelt adresse i datamaskinens minne som begynner på 0. BYOC-I-minnet kan inneholde en liste med 256 instruksjoner, mer enn nok for våre formål.

Dataprogrammer er designet for å utføre en gitt oppgave. For programmet vårt velger vi en enkel oppgave, som teller fra 1 til 5. Det er åpenbart ingen "tell" instruksjon, så det første trinnet er å dele oppgaven ned i trinn som kan håndteres av BYOC-I's begrenset instruksjonssett.

Trinn 1 Flytt 1 for å registrere AStep 2 Flytt register A for å registrere DStep 3 Legg til register D for å registrere A og lagre resultatet i register AStep 4 Flytt 5 for å registrere EStep 5 Trekk register A fra register E og lagre resultatet i register EStep 6 Hvis subtraheringsresultatet var ikke null, gå tilbake til trinn 4 og fortsett å telle Trinn 7 Hvis subtraheringsresultatet var null, gå tilbake og begynn på nytt

Det neste trinnet er å oversette disse trinnene til BYOC-I instruksjoner. BYOC-I-programmer starter på adresse 0 og nummerer fortløpende. Hoppmåladresser legges til sist etter at alle instruksjonene er på plass..

Adresse: Instruksjon - Forkortelse; Beskrivelse0: 00 11 00000001 - MVI A, 1; Flytt 1 for å registrere A1: 01 10 11 000000 - MOV D, A; Flytt register A for å registrere D2: 10 11 10 000 000 - ADD A, D; Legg til register D for å registrere A og lagre resultatet i register A3: 00 01 00 00000101 - MVI E, 5; Flytt 5 register E4: 10 01 11 001 000 - SUB E, A; Trekk register A fra register E og lagre resultat i register E5: 11 0 0 00000010 - JNZ 2; Hvis subtraksjonsresultatet ikke var null, gå tilbake til adresse 3 og fortsett å telle6: 11 1 0 00000000 - JMP 0; Hvis subtraksjonsresultatet var null, gå tilbake og begynn på nytt

Før du overfører programmet til minnet, må den binære instruksjonskoden endres til heksadesimal for å brukes med Logisim Hex Editor. Del først instruksjonen i tre grupper på 4 biter hver. Oversett deretter gruppene til heksadesimal ved hjelp av tabellen i trinn 2. Bare de tre siste heksadesimale sifrene (med fet skrift nedenfor) vil bli brukt.

Adresse - Instruksjons binær - Instruksjon Binær delt - Instruksjon (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 0000 0000 0000 0000 0000 0000 0000 0000 111000000010 1110 0000 0000 - 0x0E00

Det er på tide å overføre programmet til BYOC-I's minne for testing.

Trinn 6: Overføring av programmet til minne og testing

Overføring av programmet til minne og testing
Overføring av programmet til minne og testing
Overføring av programmet til minne og testing
Overføring av programmet til minne og testing

Når du ser på Logisim "hoved" -krets, er BYOC-I-blokken vist symbolet for den faktiske datakretsen merket "BYOC-I" i Utforskingsruten. Slik legger du inn et program i BYOC-I-minnet:

  1. Høyreklikk på BYOC-I-blokken (kalt en "underkrets") og velg (hold markøren over og venstreklikk) "View BYOC-I".
  2. BYOC-I-kretsen vil vises i arbeidsområdet. Høyreklikk på "Programminne" -symbolet og velg "Rediger innhold..".
  3. Ved å bruke Logisim Hex Editor skriver du inn den heksadesimale koden (bare fet skrift) som vist ovenfor.

Du er nå klar til å kjøre programmet. Gå tilbake til hovedkretsen ved å dobbeltklikke på "BYOC-I" i Utforskingsruten. Kjør og tilbakestill -inngangene skal være "0" for å starte. Bruk Poke Tool til å endre Reset til "1" og deretter tilbake til "0". Dette gjør startadressen 0x0000 og forbereder BYOC-I-kretsen for utførelse. Sett nå Run -inngangen til "1", og programmet vil kjøres. (Merk: Du må trykke på Control-K én gang for å starte Logisim-klokken. Dette er en funksjon som lar deg stoppe Logisim-klokken og gå gjennom et program ved å trykke på Control-T gjentatte ganger. Prøv det en gang!)

Logisim -klokken kan stilles inn for et bredt spekter av frekvenser. Som nedlastet er det 8 Hz (8 sykluser per sekund). Slik BYOC-I-datamaskinen er designet, tar hver instruksjon fire klokkesykluser å fullføre. Så, for å beregne BYOC-I-hastigheten, del klokkefrekvensen med 4. Ved 8 Hz er hastigheten 2 instruksjoner per sekund. Du kan endre klokken ved å klikke "Simuler" på verktøylinjen og velge "Kryssfrekvens". Det mulige området er 0,25 Hz til 4100 Hz. Den lave hastigheten på 8 Hz ble valgt slik at du kunne se tellingen i A -registeret.

Maksimal hastighet for BYOC-I-simuleringen (~ 1000 instruksjoner per sekund) er veldig langsom sammenlignet med moderne datamaskiner. Maskinvareversjonen av BYOC -datamaskinen som er beskrevet i boken min, utfører med mer enn 12 millioner instruksjoner per sekund!

Jeg håper denne Instructable har avmystifisert programmering av maskinspråk og gitt deg innsikt i hvordan datamaskiner fungerer på sitt mest grunnleggende nivå. For å bekrefte din forståelse, prøv å kode de to programmene nedenfor.

  1. Skriv et program som starter på 5 og teller ned til 0. (ANS. Count5to0.txt nedenfor)
  2. Starter på 2, teller med 3 til tallet overstiger 7. Du kan gjøre litt hovedregning, sjekk om 8 vet at det ville lande der, og start deretter på nytt. Skriv programmet ditt på en mer generell måte som virkelig tester om antallet "overskrider" et bestemt tall. Tips: Utforsk hva som skjer når en subtrakt gir en negativ verdi, si for eksempel 8 - 9 = -1. Eksperimenter deretter med det logiske OG for å teste om MSB i et 8-bits tall er "1". (ANS. ExceedsCount.txt)

Kan du tenke på andre utfordrende problemer for BYOC-I-datamaskinen? Gitt mer begrensninger, hva mer kan den gjøre? Del dine erfaringer med meg på [email protected]. Hvis du er interessert i koding av mikroprosessorer, kan du sjekke nettstedet mitt www.whippleway.com. Der bærer jeg maskinkoding til moderne prosessorer som ATMEL Mega -serien som brukes i Arduinos.

Anbefalt: