Innehållsförteckning:

Koda och testa en dator på maskinspråk: 6 steg
Koda och testa en dator på maskinspråk: 6 steg

Video: Koda och testa en dator på maskinspråk: 6 steg

Video: Koda och testa en dator på maskinspråk: 6 steg
Video: CS50 Live, Episode 001 2024, November
Anonim
Image
Image

I denna instruktionsbok kommer jag att visa dig hur du kodar och testar ett datorprogram på maskinspråk. Maskinspråk är dators modersmål. Eftersom den består av strängar på 1: or och 0: or, är den inte lätt att förstå av människor. För att undvika detta kodar vi program först på ett språk på hög nivå som C ++ eller Java och använder sedan speciella datorprogram för att översätta dem till 1: or och 0: or som datorer förstår. Att lära sig att koda på ett språk på hög nivå är verkligen ingen idé, men en kort introduktion till maskinspråk kan ge värdefull inblick i hur datorer fungerar och öka uppskattningen av denna mycket viktiga teknik.

För att koda och testa ett maskinspråkprogram behöver vi tillgång till en dator utan krusiduller vars maskinspråk är lätt att förstå. Personliga datorer är alldeles för komplexa för att ens övervägas. Lösningen är att använda Logisim, en logiksimulator, som körs på en persondator. Med Logisim kan vi simulera en dator som uppfyller våra behov. Videon ovan ger dig en uppfattning om vad vi kan åstadkomma med Logisim.

För datordesignen anpassade jag en från min Kindle -e -bok Build Your Own Computer - From Scratch. Jag började med den BYOC-dator som beskrivs där och trimmade ner den till den grundläggande BYOC-I (I för instruerbara) som vi kommer att använda i denna instruktionsbara.

BYOC-I: s maskinspråk är enkelt och lätt att förstå. Du behöver ingen särskild kunskap om datorer eller programmering. Allt som krävs är ett nyfiket sinne och lust att lära

Vidare läsning

Du kanske undrar varför vi använder "maskin" för att beskriva en dator när det inte är en mekanisk enhet. Anledningen är historisk; de första beräkningsenheterna var mekaniska bestående av kugghjul och hjul. Allan Shermans text, "Det var alla växlar som gick klickande …" var bara av ett eller två århundrade. Läs mer om tidig beräkning här.

Steg 1: Dellista

Maskinspråkshierarki och koder
Maskinspråkshierarki och koder

Dellistan är kort. Endast dessa två objekt krävs, båda kan laddas ner gratis:

  1. "Logisim-win-2.7.1.exe"-Logisim är en populär och lättanvänd logiksimulator. Ladda ner den körbara filen Logisim härifrån och skapa sedan en genväg på en bekväm plats som ditt skrivbord. Dubbelklicka på Logisim -ikonen för att starta den. Obs! Logisim använder Java Runtime Package som finns här. Du kan bli ombedd att ladda ner den.
  2. BYOC-I-Full.cir "-Ladda ner Logisim-kretsfilen nedan.

Starta Logisim, klicka sedan på "File-Open" och ladda filen BYOC-I-Full.cir. Bilden ovan visar Logisim -arbetsmiljön. BYOC-I representeras av subkretsblocket. Externt anslutna är två ingångar, Återställ och kör, och hexadecimala displayer för BYOC-I: s register och programminne.

BYOC-I: s programminne är förinstallerat med ett enkelt program som räknas från 1 till 5 i A-registret. Följ dessa steg för att köra (Kör) programmet.

Steg 1 - Klicka på Poke Tool. Markören bör byta till det "finger" som petar. Steg 2 - Peka på Reset -ingången två gånger, en gång ändra den till "1" och igen för att ändra den till "0". Detta återställer BYOC -I för att starta programmet på adressen 0. Steg 3 - Peka på Run -ingången en gång för att ändra det till "1". A -registret ska visa antalet som ändras från 1 till 5 och sedan upprepas. Steg 4 - Om programmet inte körs, tryck på kontroll -K så startar det.

Om du vill utforska Logisims funktioner klickar du på länken Hjälp i menyraden. Därifrån kan du utforska Logisim "Tutorial", "User Guide" och "Library Reference". En utmärkt videointroduktion finns här.

Steg 2: Hierarki och koder för maskinspråk

Maskinspråkshierarki och koder
Maskinspråkshierarki och koder

BYOC-I-datorn utför uppgifter baserade på program skrivna på maskinspråk. BYOC-I-program består i sin tur av instruktioner som utförs i en väldefinierad sekvens. Varje instruktion består av koder med fast längd som representerar olika driftskomponenter i BYOC-I. Slutligen består dessa koder av strängar på 1: or och 0: or som utgör maskinspråket som BYOC-I faktiskt utför.

Som förklaring börjar vi med koder och jobbar oss upp till programnivå. Sedan kodar vi ett enkelt program, laddar det i BYOC-I: s minne och kör det.

Koder består av ett fast antal binära (1 och 0) siffror eller bitar, kort sagt. Till exempel visar tabellen nedan alla möjliga koder (16 totalt) för en kod på 4 bitar bred. Koden visas längs sidan är hexadecimal (bas 16) och decimalekvivalent. Hexadecimal används för att referera till binära värden eftersom det är mer kompakt än binärt och lättare att konvertera från binärt än decimaltal. "0x" -prefixet låter dig veta att talet som följer är hexadecimalt eller "hex" för 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 på en kod avgör hur många objekt som kan representeras. Som nämnts kan den 4-bitars breda koden ovan representera upp till 16 objekt (0 till 15); det vill säga 2 gånger 2 tagna fyra gånger eller 2 till 4: e effekten är lika med 16. I allmänhet är antalet representabla objekt 2 höjt till n: e kraften. Här är en kort lista över n-bitars kodkapacitet.

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

BYOC-I datorkodbredder väljs för att rymma antalet objekt som ska representeras av koden. Till exempel finns det fyra instruktionstyper, så en 2-bitars bred kod är lämplig. Här är BYOC-I-koder med en kort förklaring av varje.

Instruktionstypkod (tt) Det finns fyra instruktionstyper: (1) MVI - Flytta ett omedelbart 8 -bitars konstant värde till ett minnesregister. Minnesregistret är en enhet som innehåller data som ska användas för en beräkning, (2) MOV - Flytta data från ett register till ett annat, (3) RRC - Utför en register -till -register -beräkning och (4) JMP - Jump till en annan instruktion istället för att fortsätta vid nästa instruktion. BYOC-I-instruktionstypkoderna är följande:

00 MVI01 MOV10 RRC11 JMP

Registerkod (dd och ss) BYOC-I har fyra 8-bitars register som kan lagra värden från 0 till 255. En 2-bitars kod räcker för att beteckna de fyra registren:

00 F register01 E register10 D register11 A register

Beräkningskod (ccc) BYOC-I stöder fyra aritmetiska/logiska operationer. För att möjliggöra framtida expansion till åtta beräkningar används en 3-bitars kod:

000 ADD, lägg till två 8-bitars värden i angivna register och lagra resultatet i ett av registren 001 SUB, subtrahera två 8-bitars värden i angivna register och lagra resultatet i ett av registren 010-011 Reserverat för framtida användning100 OCH, logiskt OCH två 8-bitars värden i utpekade register och lagra resultatet i ett av registren 101 ELLER, logiskt ELLER två 8-bitars värden i angivna register och lagra resultatet i ett av registren 110 till 111, reserverat för framtida användning

Hoppkod (j) En 1-bitars kod som anger om hoppet är ovillkorligt (j = 1) eller villkorat av ett icke-noll beräkningsresultat (j = 0).

Data/adresskod (v… v)/(a… a) 8-bitars data kan inkluderas i vissa instruktioner som representerar värden från 00000000 till 11111111 eller 0 till 255 decimaler. Denna data är 8-bitars bred för lagring i BYOC-I: s 8-bitars register. Med decimalräkning visar vi inte ledande nollor. Med dataritmetik visar vi ledande nollor men de påverkar inte värdet. 00000101 är numeriskt lika med 101 eller 5 decimaler.

Föreslagna referenser

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

Vidare läsning

Tanken med att använda koder för att driva en process går långt tillbaka. Ett fascinerande exempel är Jacquard Loom. Den automatiska vävstolen styrdes av en kedja av träkort där det borrades hål som representerar koder för olika färgade garn för vävning. Jag såg min första i Skottland där den användes för att göra färgglada tartaner. Läs mer om Jacquard Looms här.

Steg 3: Anatomi av BYOC-I-instruktioner

Anatomi av BYOC-I-instruktioner
Anatomi av BYOC-I-instruktioner

Med tanke på BYOC-I: s koder går vi upp till nästa nivå, instruktioner. För att skapa en instruktion för BYOC-I placerar vi koderna tillsammans i angiven ordning och på specifika platser inom instruktionen. Alla koder visas inte i alla instruktioner, men när de gör det intar de en viss plats.

MVI -instruktionstypen kräver flest bitar, 12 totalt. Genom att göra instruktionsordet 12 bitar i längd rymmer vi alla instruktioner. Oanvända (så kallade "don't care") bitar ges värdet 0. Här är BYOC-I instruktionsuppsättning.

  1. Flytta omedelbart (MVI) - 00 dd vvvvvvvvFunktion: Flytta ett 8 -bitars datavärde V = vvvvvvvv till destinationsregistret dd. Efter körningen har registret dd värdet vvvvvvvv. Förkortning: MVI R, V där R är A, D, E eller F. Exempel: 00 10 00000101 - MVI D, 5 - Flytta värdet 5 till D -registret.
  2. Flytta register till register (MOV) - 01 dd ss 000000Funktion: Flytta data från källregister ss till desinationsregister dd. Efter körningen har båda registren samma värde som källregistret. Förkortning: MOV Rd, Rs där Rd är destinationsregistret A, D, E eller F och Rs är källregistret A, D, E eller F. Exempel: 01 11 01 000000 - MOV A, E - Flytta värdet i register E för att registrera A.
  3. Registrera för att registrera beräkning (RRC) - 10 dd ss ccc 000 Funktion: Utför angiven beräkning ccc med hjälp av källregister ss och destinationsregister dd och sedan lagra resultatet i destinationsregistret. Förkortningar: ADD Rd, Rs (ccc = 000 Rd + Rs lagrade i Rd); SUB Rd, Rs (ccc = 001 Rd - Rs lagrade i Rd); AND Rd, Rs (ccc = 100 Rd AND Rs lagrade i Rd); ELLER Rd, Rs (ccc = 101 Rd ELLER Rs lagrade i Rd). Exempel: 10 00 11 001 000 - SUB F, A - subtrahera värdet i A -registret från F -registret med resultatet i F -registret.
  4. Hoppa till olika instruktioner (JMP) - 11 j 0 aaaaaaaaFunktion: Ändra körning till en annan instruktion som ligger på adressen aaaa aaaa (a) Villkorligt (j = 1) -11 1 0 aaaaaaaa Förkortning: JMP L där L är adress aaaa aaaaExempel: 11 1 0 00001000 - JMP 8 - Ändra utförande till adress 8. (b) Villkorligt (j = 0) när föregående beräkning resulterade i ett resultat som inte är noll - 11 0 0 aaaaaaaa Förkortning: JNZ L där L är adress aaaa aaaa. Exempel: 11 0 0 00000100 JNZ 4 Om den senaste beräkningen gav ett värde som inte var noll, ändra utförandet till adress 4.

Instruktionsordbitar är numrerade vänster (mest betydande bit MSB) till höger (minst signifikanta bit LSB) från 11 till 0. Den fasta ordningen och platserna för koderna är följande:

Bits-Kod11-10 Instruktionstyp9-8 Destinationsregister7-6 Källregister5-3 Beräkning: 000-lägg till; 001 - subtrahera; 100 - logiskt OCH; 101 - logiskt OR7-0 Konstant värde v… v och a… a (0 till 255)

Instruktionsuppsättningen sammanfattas i figuren ovan. Notera det strukturerade och ordnade utseendet på koder i varje instruktion. Resultatet är en enklare design för BYOC-I och det gör instruktioner lättare för människor att förstå.

Steg 4: Kodning av en datorinstruktion

Kodning av en datorinstruktion
Kodning av en datorinstruktion

Innan vi går till programnivå, låt oss konstruera några exempelinstruktioner med hjälp av BYOC-I-instruktionsuppsättningen ovan.

1. Flytta värdet 1 till register A. BYOC-I-registren kan lagra värden från 0 till 255. I detta fall kommer register A att ha värdet 1 (00000001 binärt) efter att instruktionen har utförts.

Förkortning: MVI A, 1Koder som krävs: Typ MVI - 00; Destinationsregister A - 11; Värde - 00000001Instruktionsord: 00 11 00000001

2. Flytta innehållet i register A till register D. Efter körningen kommer båda registren att ha värdet ursprungligen i register A.

Förkortning: MOV D, A (Kom ihåg att destinationen är första och källa andra i listan) Koder som krävs: Skriv MOV - 01; Destinationsregister D - 10; Källregister A - 11Instruktionsord: 01 10 11 000000

3. Lägg till innehållet i register D till register A och lagra i register A. Efter utförandet kommer register A: s värde att vara summan av det ursprungliga värdet för register A och register D.

Förkortning: ADD A, D (Resultatet lagras i destinationsregistret) Koder som krävs: Typ RRC - 10; Destinationsregister A - 11; Källregister D - 10; Beräkningstillägg - 000Instruktionsord: 10 11 10 000 000 (ccc är första 000 - lägg till)

4. Hoppa på inte noll till adress 3. Om resultatet av den senaste beräkningen inte var noll, kommer körningen att ändras till instruktionen på den angivna adressen. Om noll återupptas körningen vid instruktionerna nedan.

Förkortning: JNZ 3Koder som krävs: Typ JMP - 11; Hopptyp - 0; Adress - 00000003Instruktionsord: 11 0 0 00000003 (Hopptyp är först 0)

5. Hoppa ovillkorligt till adress 0. Efter körning ändras körningen i instruktionen på den angivna adressen.

Förkortning: JMP 0Kod krävs: Typ JMP - 11; Hopptyp - 1; Adress - 00000000Instruktionsord; 11 1 0 00000000

Medan maskinkodning är lite tråkig kan du se att det inte är omöjligt svårt. Om du var maskinkodning på riktigt skulle du använda ett datorprogram som kallas en assembler för att översätta från förkortningen (som kallas monteringskod) till maskinkod.

Steg 5: Anatomi av ett datorprogram

Anatomi av ett datorprogram
Anatomi av ett datorprogram

Ett datorprogram är en lista med instruktioner som datorn kör med början i början av listan och fortsätter neråt i listan till slutet. Instruktioner som JNZ och JMP kan ändra vilken instruktion som utförs nästa. Varje instruktion i listan upptar en enda adress i datorns minne från och med 0. BYOC-I-minnet kan innehålla en lista med 256 instruktioner, mer än tillräckligt för våra ändamål.

Datorprogram är utformade för att utföra en given uppgift. För vårt program väljer vi en enkel uppgift, som räknar från 1 till 5. Självklart finns det ingen "räkna" instruktion, så det första steget är att dela upp uppgiften i steg som kan hanteras av BYOC-I: s mycket begränsad instruktionsuppsättning.

Steg 1 Flytta 1 för att registrera AStep 2 Flytta register A för att registrera DStep 3 Lägg till register D för att registrera A och lagra resultatet i register AStep 4 Flytta 5 för att registrera EStep 5 Subtrahera register A från register E och spara resultatet i register EStep 6 Om subtraktionsresultatet var inte noll, gå tillbaka till steg 4 och fortsätt räkna Steg 7 Om subtraktionsresultatet var noll, gå tillbaka och börja om

Nästa steg är att översätta dessa steg till BYOC-I-instruktioner. BYOC-I-program börjar på adressen 0 och numrerar i rad. Hoppmåladresser läggs till senast efter att alla instruktioner är på plats.

Adress: Instruktion - Förkortning; Beskrivning0: 00 11 00000001 - MVI A, 1; Flytta 1 för att registrera A1: 01 10 11 000000 - MOV D, A; Flytta register A för att registrera D2: 10 11 10 000 000 - ADD A, D; Lägg till register D för att registrera A och lagra resultatet i register A3: 00 01 00 00000101 - MVI E, 5; Flytta 5 register E4: 10 01 11 001 000 - SUB E, A; subtrahera register A från register E och lagra resultat i register E5: 11 0 0 00000010 - JNZ 2; Om subtraktionsresultatet inte var noll, gå tillbaka till adress 3 och fortsätt räkna6: 11 1 0 00000000 - JMP 0; Om subtraktionsresultatet var noll, gå tillbaka och börja om

Innan programmet överförs till minnet måste den binära instruktionskoden ändras till hexadecimal för att användas med Logisim Hex Editor. Dela först instruktionen i tre grupper om 4 bitar vardera. Översätt sedan grupperna till hexadecimala med hjälp av tabellen i steg 2. Endast de tre sista hexadecimala siffrorna (med fet stil nedan) kommer att användas.

Adress - 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 0000 0000 0000 0000 00000 111000000010 1110 0000 0000 - 0x0E00

Det är dags att överföra programmet till BYOC-I: s minne för testning.

Steg 6: Överföra programmet till minne och testning

Överföra programmet till minne och testning
Överföra programmet till minne och testning
Överföra programmet till minne och testning
Överföra programmet till minne och testning

När man tittar på Logisim "huvud" -krets är BYOC-I-blocket som är symbolen för den faktiska datorkretsen märkt "BYOC-I" i Utforskarfönstret. Så här anger du ett program i BYOC-I-minnet:

  1. Högerklicka på BYOC-I-blocket (kallas en "underkrets") och välj (håll muspekaren över och vänsterklicka) "Visa BYOC-I".
  2. BYOC-I-kretsen visas i arbetsområdet. Högerklicka på symbolen "Programminne" och välj "Redigera innehåll..".
  3. Använd Logisim Hex Editor och ange hexadecimalkoden (endast fetstil) enligt ovan.

Du är nu redo att köra programmet. Återgå till huvudkretsen genom att dubbelklicka på "BYOC-I" i Utforskarfönstret. Kör och återställ ingångarna bör vara "0" för att starta. Använd Poke -verktyget, ändra först Reset till "1" och sedan tillbaka till "0". Detta gör startadressen 0x0000 och förbereder BYOC-I-kretsen för körning. Peka nu Run -ingången till "1" och programmet körs. (Obs! Du måste först trycka på Control-K en gång för att starta Logisim-klockan. Detta är en funktion som låter dig stoppa Logisim-klockan och gå igenom ett program genom att trycka på Control-T upprepade gånger. Prova någon gång!)

Logisim -klockan kan ställas in för ett stort antal frekvenser. Som nedladdad är den 8 Hz (8 cykler per sekund). Såsom BYOC-I-datorn är utformad tar varje instruktion fyra klockcykler att slutföra. Så, för att beräkna BYOC-I-hastigheten, dela klockfrekvensen med 4. Vid 8 Hz är dess hastighet 2 instruktioner per sekund. Du kan ändra klockan genom att klicka på "Simulera" i verktygsfältet och välja "Kryssfrekvens". Det möjliga intervallet är 0,25 Hz till 4100 Hz. Den långsamma hastigheten vid 8 Hz valdes så att du kunde titta på räkningen i A -registret.

Maxhastigheten för BYOC-I-simuleringen (~ 1000 instruktioner per sekund) är mycket långsam jämfört med moderna datorer. Hårdvaruversionen av BYOC -datorn som beskrivs i min bok körs med mer än 12 miljoner instruktioner per sekund!

Jag hoppas att denna Instructable har avmystifierat programmering av maskinspråk och gett dig inblick i hur datorer fungerar på sin mest grundläggande nivå. För att förstärka din förståelse, försök att koda de två programmen nedan.

  1. Skriv ett program som börjar vid 5 och räknar ner till 0. (ANS. Count5to0.txt nedan)
  2. Börja med 2, räkna med 3 tills antalet överstiger 7. Du kan göra lite huvudräkning, kolla efter 8 vet att det skulle landa där och starta om. Skriv ditt program på ett mer allmänt sätt som verkligen testar om antalet "överstiger" ett visst antal. Tips: Utforska vad som händer när ett subtraktion ger ett negativt värde, säg 8 - 9 = -1 till exempel. Experimentera sedan med det logiska OCH för att testa om MSB i ett 8-bitars tal är "1". (ANS. ExceedsCount.txt)

Kan du tänka på andra utmanande problem för BYOC-I-datorn? Med tanke på dess begränsningar, vad mer kan den göra? Dela dina erfarenheter med mig på [email protected]. Om du är intresserad av att koda mikroprocessorer, kolla in min webbplats www.whippleway.com. Där bär jag maskinkodning till moderna processorer som ATMEL Mega -serien som används i Arduinos.

Rekommenderad: