Indholdsfortegnelse:

Kode og test en computer på maskinsprog: 6 trin
Kode og test en computer på maskinsprog: 6 trin

Video: Kode og test en computer på maskinsprog: 6 trin

Video: Kode og test en computer på maskinsprog: 6 trin
Video: Как самому создать QR-код в Google-таблицах? +Как создавать красивые QR-коды! 2024, November
Anonim
Image
Image

I denne Instructable vil jeg vise dig, hvordan du koder og tester et computerprogram på maskinsprog. Maskinsprog er computernes modersmål. Fordi det er sammensat af strenge på 1'er og 0'er, er det ikke let forståeligt for mennesker. For at omgå dette, koder vi programmer først på et sprog på højt niveau som C ++ eller Java og bruger derefter specielle computerprogrammer til at oversætte dem til 1'erne og 0'erne, computere forstår. At lære at kode på et sprog på højt niveau er bestemt ingen idé, men en kort introduktion til maskinsprog kan give værdifuld indsigt i, hvordan computere fungerer og øge forståelsen for denne meget vigtige teknologi.

For at kode og teste et maskinsprogsprogram har vi brug for adgang til en computer uden problemer, hvis maskinsprog let kan forstås. Personlige computere er alt for komplekse til selv at overveje. Løsningen er at bruge Logisim, en logisk simulator, der kører på en personlig computer. Med Logisim kan vi simulere en computer, der opfylder vores behov. Videoen ovenfor giver dig en ide om, hvad vi kan opnå med Logisim.

Til computerdesignet tilpassede jeg en fra min Kindle -e -bog Build Your Own Computer - From Scratch. Jeg startede med BYOC computeren beskrevet der og trimmede den ned til den varierende grundlæggende BYOC-I (I for Instructable), vi vil bruge i denne Instructable.

BYOC-I's maskinesprog er enkelt og let at forstå. Du behøver ikke nogen særlig viden om computere eller programmering. Alt der kræves er et nysgerrig sind og lyst til at lære

Yderligere læsning

Du undrer dig måske over, hvorfor vi bruger "maskine" til at beskrive en computer, når den ikke er en mekanisk enhed. Årsagen er historisk; de første computerenheder var mekaniske bestående af tandhjul og hjul. Allan Shermans tekst, "Det var alle gear, der gik klikkende …" var kun et århundrede eller to. Læs mere om tidlig computing her.

Trin 1: Deleliste

Maskinsprogshierarki og koder
Maskinsprogshierarki og koder

Delelisten er kort. Kun disse to elementer er påkrævet, begge kan downloades gratis:

  1. "Logisim-win-2.7.1.exe"-Logisim er en populær og brugervenlig logiksimulator. Download den eksekverbare Logisim -fil herfra, og opret derefter en genvej på et bekvemt sted som dit skrivebord. Dobbeltklik på Logisim -ikonet for at starte det. Bemærk: Logisim bruger Java Runtime Package, der findes her. Du bliver muligvis bedt om at downloade den.
  2. BYOC-I-Full.cir "-Download Logisim-kredsløbsfilen herunder.

Start Logisim, klik derefter på "File-Open" og indlæs filen BYOC-I-Full.cir. Billedet ovenfor viser Logisim -arbejdsmiljøet. BYOC-I er repræsenteret af subcircuitblokken. Eksternt forbundet to indgange, Reset og Run og hexadecimale displays for BYOC-I's registre og programhukommelse.

BYOC-I's programhukommelse er forudindlæst med et enkelt program, der tæller fra 1 til 5 i A-registret. Følg disse trin for at udføre (Kør) programmet.

Trin 1 - Klik på Poke Tool. Markøren skal skifte til stikkende "finger". Trin 2 - Stik nulstillingsindgangen to gange, en gang ændret den til "1" og igen for at ændre den tilbage til "0". Dette nulstiller BYOC -I for at starte programmet på adressen 0. Trin 3 - Poke Run -input én gang for at ændre det til "1". A -registret skal vise antallet, der ændres fra 1 til 5 og derefter gentages. Trin 4 - Hvis programmet ikke udføres, skal du trykke på kontrol -K, og det skal starte.

Hvis du vil udforske Logisims muligheder, skal du klikke på linket Hjælp i menulinjen. Derfra kan du udforske Logisim "Tutorial", "User Guide" og "Library Reference". En glimrende videoindledning findes her.

Trin 2: Maskinsprogshierarki og koder

Maskinsprogshierarki og koder
Maskinsprogshierarki og koder

BYOC-I-computeren udfører opgaver baseret på programmer, der er skrevet på maskinsprog. BYOC-I-programmer består til gengæld af instruktioner udført i en veldefineret sekvens. Hver instruktion består af koder med fast længde, der repræsenterer forskellige operationelle komponenter i BYOC-I. Endelig består disse koder af strenge på 1'er og 0'er, der udgør maskinsproget, som BYOC-I rent faktisk udfører.

Som forklaring starter vi med koder og arbejder os op til programniveau. Derefter koder vi et enkelt program, indlæser det i BYOC-I's hukommelse og udfører det.

Koder består kort sagt af et fast antal binære (1 og 0) cifre eller bits. For eksempel viser tabellen nedenfor alle de mulige koder (16 i alt) for en kode, der er 4 bit bred. Vist langs siden er koden hexadecimal (base 16) og decimalækvivalent. Hexadecimal bruges til at referere til binære værdier, da det er mere kompakt end binært og lettere at konvertere fra binært end decimal. Præfikset "0x" lader dig vide, at det følgende tal er hexadecimalt eller "hex" for kort.

Binær - Hexadecimal - Decimal0000 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 af en kode bestemmer, hvor mange elementer der kan repræsenteres. Som nævnt kan den 4-bit brede kode ovenfor repræsentere op til 16 elementer (0 til 15); det vil sige 2 gange 2 taget fire gange eller 2 til 4. effekt er lig med 16. Generelt er antallet af repræsentative poster 2 hævet til den niende effekt. Her er en kort liste over n-bit kodekapaciteter.

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

BYOC-I computerkodebredder vælges for at rumme antallet af elementer, der skal repræsenteres af koden. For eksempel er der fire instruktionstyper, så en 2-bit bred kode er egnet. Her er BYOC-I-koderne med en kort forklaring af hver.

Instruktionstype kode (tt) Der er fire instruktionstyper: (1) MVI - Flyt en umiddelbar 8 -bit konstant værdi til et hukommelsesregister. Hukommelsesregistret er en enhed, der indeholder data, der skal bruges til en beregning, (2) MOV - Flyt data fra et register til et andet, (3) RRC - Udfør en register -til -register -beregning, og (4) JMP - Jump til en anden instruktion i stedet for at fortsætte med den næste instruktion. De vedtagne BYOC-I instruktionstypekoder er som følger:

00 MVI01 MOV10 RRC11 JMP

Registrer kode (dd og ss) BYOC-I har fire 8-bit registre, der er i stand til at lagre værdier fra 0 til 255. En 2-bit kode er tilstrækkelig til at angive de fire registre:

00 F register01 E register10 D register11 A register

Beregningskode (ccc) BYOC-I understøtter fire aritmetiske/logiske operationer. For at muliggøre fremtidig udvidelse til otte beregninger bruges en 3-bit kode:

000 ADD, tilføj to 8-bit værdier i udpegede registre og gem resultatet i et af registrene 001 SUB, træk to 8-bit værdier i udpegede registre og gem resultatet i et af registrene 010-011 Reserveret til fremtidig brug100 OG, logisk OG to 8-bit værdier i udpegede registre og gemme resultatet i et af registre101 ELLER, logisk ELLER to 8-bit værdier i udpegede registre og gemme resultatet i et af registre110 til 111, Reserveret til fremtidig brug

Springkode (j) En 1-bit kode, der angiver, om springet er ubetinget (j = 1) eller betinget af et ikke-nul beregningsresultat (j = 0).

Data/adressekode (v… v)/(a… a) 8-bit data kan inkluderes i visse instruktioner, der repræsenterer værdier fra 00000000 til 11111111 eller 0 til 255 decimaler. Disse data er 8-bit brede til lagring i BYOC-I's 8-bit registre. Med decimalregning viser vi ikke førende nuller. Med computerregning viser vi førende nuller, men de påvirker ikke værdien. 00000101 er numerisk det samme med 101 eller 5 decimaler.

Foreslåede referencer

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

Yderligere læsning

Ideen om at bruge koder til at drive en proces går langt tilbage. Et fascinerende eksempel er Jacquard Loom. Den automatiserede væve blev styret af en kæde af trækort, hvor der blev boret huller, der repræsenterer koder for garn i forskellige farver til vævning. Jeg så min første i Skotland, hvor den blev brugt til at lave farverige tartaner. Læs mere om Jacquard Looms her.

Trin 3: Anatomi af BYOC-I instruktioner

Anatomi af BYOC-I instruktioner
Anatomi af BYOC-I instruktioner

I betragtning af BYOC-I's koder går vi op til det næste niveau, instruktioner. For at oprette en instruktion til BYOC-I placerer vi koderne sammen i en bestemt rækkefølge og på bestemte steder i instruktionen. Ikke alle koder vises i alle instruktioner, men når de gør det, indtager de en bestemt placering.

MVI -instruktionstypen kræver flest bits, 12 i alt. Ved at lave instruktionsordet 12 bit i længden, kan vi rumme alle instruktioner. Ubrugte (såkaldte "ligeglade") bits får værdien 0. Her er BYOC-I instruktionssæt.

  1. Move Immediate (MVI) - 00 dd vvvvvvvvFunktion: Flyt en 8 -bit dataværdi V = vvvvvvvv til destinationsregistret dd. Efter udførelsen vil register dd have værdien vvvvvvvv. Forkortelse: MVI R, V hvor R er A, D, E eller F. Eksempel: 00 10 00000101 - MVI D, 5 - Flyt værdien 5 til D -registret.
  2. Flyt register til register (MOV) - 01 dd ss 000000Funktion: Flyt data fra kilderegister ss til desinationsregister dd. Efter udførelse har begge registre den samme værdi som kilderegistret. Forkortelse: MOV Rd, Rs hvor Rd er destinationsregisteret A, D, E eller F, og Rs er kilderegisteret A, D, E eller F. Eksempel: 01 11 01 000000 - MOV A, E - Flyt værdien i register E for at registrere A.
  3. Registrer til registreringsberegning (RRC) - 10 dd ss ccc 000Funktion: Udfør udpeget beregning ccc ved hjælp af kilderegister ss og destinationsregister dd derefter lagring af resultatet i destinationsregistret. Forkortelser: ADD Rd, Rs (ccc = 000 Rd + Rs gemt i Rd); SUB Rd, Rs (ccc = 001 Rd - Rs gemt i Rd); AND Rd, Rs (ccc = 100 Rd AND Rs lagret i Rd); ELLER Rd, Rs (ccc = 101 Rd ELLER Rs gemt i Rd). Eksempel: 10 00 11 001 000 - SUB F, A - Træk værdien i A -registret fra F -registret med resultatet i F -registret.
  4. Spring til anden instruktion (JMP) - 11 j 0 aaaaaaaaFunktion: Skift udførelse til en anden instruktion placeret på adressen aaaa aaaa (a) Ubetinget (j = 1) -11 1 0 aaaaaaaa Forkortelse: JMP L hvor L er adresse aaaa aaaaEksempel: 11 1 0 00001000 - JMP 8 - Ændring af udførelse til adresse 8. (b) Betinget (j = 0), da den tidligere beregning resulterede i et ikke -nul resultat - 11 0 0 aaaaaaaa Forkortelse: JNZ L, hvor L er adresse aaaa aaaa. Eksempel: 11 0 0 00000100 JNZ 4 Hvis den sidste beregning gav en værdi uden nul, skal du ændre udførelsen til adresse 4.

Instruktionsordbit er nummereret fra venstre (den mest betydningsfulde bit MSB) til højre (mindst signifikante bit LSB) fra 11 til 0. Den faste rækkefølge og placeringen af koderne er som følger:

Bits-Code11-10 Instruction Type9-8 Destinationsregister7-6 Kilderegister5-3 Beregning: 000-tilføj; 001 - trække fra; 100 - logisk OG; 101 - logisk OR7-0 Konstant værdi v… v og a… a (0 til 255)

Instruktionssættet er opsummeret i figuren ovenfor. Bemærk det strukturerede og ordnede udseende af koderne i hver instruktion. Resultatet er et enklere design til BYOC-I, og det gør instruktioner lettere for mennesker at forstå.

Trin 4: Kodning af en computerinstruktion

Kodning af en computerinstruktion
Kodning af en computerinstruktion

Inden vi går til programniveau, lad os konstruere nogle eksempelinstruktioner ved hjælp af BYOC-I Instruction Set ovenfor.

1. Flyt værdien 1 for at registrere A. BYOC-I-registre kan gemme værdier fra 0 til 255. I dette tilfælde vil register A have værdien 1 (00000001 binær) efter udførelsen af instruktionen.

Forkortelse: MVI A, 1Koder påkrævet: Type MVI - 00; Destinationsregister A - 11; Værdi - 00000001Instruktionsord: 00 11 00000001

2. Flyt indholdet af register A til register D. Efter udførelse vil begge registre have værdien oprindeligt i register A.

Forkortelse: MOV D, A (Husk, destinationen er først og kilde anden på listen) Påkrævede koder: Skriv MOV - 01; Destinationsregister D - 10; Kilderegister A - 11Instruktionsord: 01 10 11 000000

3. Tilføj indhold i register D til register A og gem i register A. Efter udførelse vil register A's værdi være summen af den oprindelige værdi af register A og register D.

Forkortelse: ADD A, D (Resultatet gemmes i destinationsregistret) Påkrævede koder: Type RRC - 10; Destinationsregister A - 11; Kilderegister D - 10; Beregning Tilføj - 000Instruktionsord: 10 11 10 000 000 (ccc er første 000 - tilføj)

4. Spring på ikke nul til adresse 3. Hvis resultatet af den sidste beregning ikke var nul, ændres udførelsen til instruktionen på den givne adresse. Hvis nul, genoptages udførelsen efter den følgende instruktion.

Forkortelse: JNZ 3Koder påkrævet: Type JMP - 11; Springtype - 0; Adresse - 00000003Instruktionsord: 11 0 0 00000003 (Springtype er første 0)

5. Spring ubetinget til adresse 0. Efter eksekvering ændres udførelsen af instruktionen på den givne adresse.

Forkortelse: JMP 0Kode påkrævet: Type JMP - 11; Springtype - 1; Adresse - 00000000Instruktionsord; 11 1 0 00000000

Mens maskinkodning er lidt kedelig, kan du se, at det ikke er umuligt svært. Hvis du var maskinkodning for ægte, ville du bruge et computerprogram kaldet en assembler til at oversætte fra forkortelsen (som kaldes samlingskode) til maskinkode.

Trin 5: Anatomi af et computerprogram

Anatomi af et computerprogram
Anatomi af et computerprogram

Et computerprogram er en liste over instruktioner, som computeren udfører begyndende i starten af listen og fortsætter ned på listen til slutningen. Instruktioner som JNZ og JMP kan ændre, hvilken instruktion der udføres derefter. Hver instruktion på listen indtager en enkelt adresse i computerens hukommelse, der starter med 0. BYOC-I-hukommelsen kan indeholde en liste med 256 instruktioner, mere end nok til vores formål.

Computerprogrammer er designet til at udføre en given opgave. For vores program vælger vi en simpel opgave, der tæller fra 1 til 5. Der er naturligvis ingen "tælle" instruktion, så det første trin er at opdele opgaven i trin, der kan håndteres af BYOC-I's meget begrænset instruktionssæt.

Trin 1 Flyt 1 for at registrere AStep 2 Flyt register A for at registrere DStep 3 Tilføj register D for at registrere A og gemme resultatet i register AStep 4 Flyt 5 for at registrere EStep 5 Træk register A fra register E og gem resultatet i register EStep 6 Hvis subtraktionsresultatet var ikke nul, gå tilbage til trin 4 og fortsæt med at tælle Trin 7 Hvis subtraktionsresultatet var nul, skal du gå tilbage og starte forfra

Det næste trin er at oversætte disse trin til BYOC-I instruktioner. BYOC-I-programmer starter på adressen 0 og nummereres fortløbende. Jump -måladresser tilføjes sidst, efter at alle instruktioner er på plads.

Adresse: Instruktion - Forkortelse; Beskrivelse0: 00 11 00000001 - MVI A, 1; Flyt 1 for at registrere A1: 01 10 11 000000 - MOV D, A; Flyt register A for at registrere D2: 10 11 10 000 000 - ADD A, D; Tilføj register D for at registrere A og gemme resultatet i register A3: 00 01 00 00000101 - MVI E, 5; Flyt 5 register E4: 10 01 11 001 000 - SUB E, A; Træk register A fra register E og gem resultat i register E5: 11 0 0 00000010 - JNZ 2; Hvis subtraktionsresultatet ikke var nul, skal du gå tilbage til adresse 3 og fortsætte med at tælle6: 11 1 0 00000000 - JMP 0; Hvis subtraktionsresultatet var nul, skal du gå tilbage og starte forfra

Inden programmet overføres til hukommelsen, skal den binære instruktionskode ændres til hexadecimal for at kunne bruges sammen med Logisim Hex Editor. Opdel først instruktionen i tre grupper på 4 bits hver. Oversæt derefter grupperne til hexadecimal ved hjælp af tabellen i trin 2. Kun de sidste tre hexadecimale cifre (med fed skrift nedenfor) vil blive brugt.

Adresse - Instruktion Binær - Instruktion Binær Split - Instruktion (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 00000 111000000010 1110 0000 0000 - 0x0E00

Det er tid til at overføre programmet til BYOC-I's hukommelse til test.

Trin 6: Overførsel af programmet til hukommelse og test

Overførsel af programmet til hukommelse og test
Overførsel af programmet til hukommelse og test
Overførsel af programmet til hukommelse og test
Overførsel af programmet til hukommelse og test

Når man ser på Logisim "hoved" kredsløb, er den viste BYOC-I-blok symbolet for det faktiske computerkredsløb mærket "BYOC-I" i Explorer-panelet. Sådan indtaster du et program i BYOC-I-hukommelsen:

  1. Højreklik på BYOC-I-blokken (kaldet en "subcircuit") og vælg (hold musen over og venstre klik) "View BYOC-I".
  2. BYOC-I kredsløbet vises i arbejdsområdet. Højreklik på symbolet "Programhukommelse" og vælg "Rediger indhold..".
  3. Brug Logisim Hex Editor til at indtaste den hexadecimale kode (kun fed) som vist ovenfor.

Du er nu klar til at køre programmet. Vend tilbage til hovedkredsløbet ved at dobbeltklikke på "BYOC-I" i stifinderruden. Kør og nulstil input skal være "0" for at starte. Ved hjælp af Poke Tool skal du først ændre Nulstil til "1" og derefter tilbage til "0". Dette gør startadressen 0x0000 og forbereder BYOC-I kredsløbet til udførelse. Sæt nu Run -input til "1", og programmet udføres. (Bemærk: Du skal først trykke på Control-K én gang for at starte Logisim-uret. Dette er en funktion, der giver dig mulighed for at stoppe Logisim-uret og gå gennem et program ved at trykke gentagne gange på Control-T. Prøv det engang!)

Logisim -uret kan indstilles til en lang række frekvenser. Som downloadet er det 8 Hz (8 cyklusser pr. Sekund). Den måde BYOC-I computeren er designet på, tager hver instruktion fire urcyklusser at gennemføre. Så for at beregne BYOC-I-hastigheden divideres urfrekvensen med 4. Ved 8 Hz er hastigheden 2 instruktioner pr. Sekund. Du kan ændre uret ved at klikke på "Simuler" på værktøjslinjen og vælge "Tick Frequency". Det mulige område er 0,25 Hz til 4100 Hz. Den langsomme hastighed ved 8 Hz blev valgt, så du kunne se tællingen i A -registret.

Den maksimale hastighed for BYOC-I-simuleringen (~ 1000 instruktioner pr. Sekund) er meget langsom i forhold til moderne computere. Hardwareversionen af BYOC -computeren beskrevet i min bog udfører med mere end 12 millioner instruktioner pr. Sekund!

Jeg håber, at denne Instructable har afmystificeret maskinsprogsprogrammering og givet dig indsigt i, hvordan computere fungerer på deres mest basale niveau. For at klippe din forståelse, prøv at kode de to programmer herunder.

  1. Skriv et program, der starter med 5 og tæller ned til 0. (ANS. Count5to0.txt nedenfor)
  2. Start fra 2, tæl med 3, indtil tallet overstiger 7. Du kan lave lidt hovedregning, kontrollere for 8, velvidende at det ville lande der, og derefter genstarte. Skriv dit program på en mere generel måde, der virkelig tester, om antallet "overstiger" et bestemt tal. Tip: Undersøg, hvad der sker, når en subtraktion giver en negativ værdi, f.eks. 8 - 9 = -1. Eksperimenter derefter med det logiske OG for at teste, om MSB'en i et 8-bit tal er "1". (ANS. ExceedsCount.txt)

Kan du tænke på andre udfordrende problemer for BYOC-I computeren? I betragtning af dets begrænsninger, hvad mere kan den gøre? Del dine oplevelser med mig på [email protected]. Hvis du er interesseret i at kode mikroprocessorer, kan du tjekke mit websted www.whippleway.com. Der bærer jeg maskinkodning til moderne processorer som ATMEL Mega -serien, der bruges i Arduinos.

Anbefalede: