Sommario:

Codifica e testa un computer in linguaggio macchina: 6 passaggi
Codifica e testa un computer in linguaggio macchina: 6 passaggi

Video: Codifica e testa un computer in linguaggio macchina: 6 passaggi

Video: Codifica e testa un computer in linguaggio macchina: 6 passaggi
Video: Il ciclo macchina 2024, Dicembre
Anonim
Image
Image

In questo Instructable, ti mostrerò come codificare e testare un programma per computer in linguaggio macchina. Il linguaggio macchina è il linguaggio nativo dei computer. Poiché è composto da stringhe di 1 e 0, non è facilmente comprensibile dagli umani. Per ovviare a questo, codifichiamo programmi prima in un linguaggio di alto livello come C++ o Java, quindi utilizziamo programmi speciali per computer per tradurli negli 1 e negli 0 che i computer capiscono. Imparare a programmare in un linguaggio di alto livello è certamente un gioco da ragazzi, ma una breve introduzione al linguaggio macchina può fornire preziose informazioni su come funzionano i computer e aumentare l'apprezzamento di questa tecnologia molto importante.

Per codificare e testare un programma in linguaggio macchina, abbiamo bisogno di accedere a un computer senza fronzoli il cui linguaggio macchina è facilmente comprensibile. I personal computer sono troppo complessi anche per essere presi in considerazione. La soluzione è usare Logisim, un simulatore logico, che gira su un personal computer. Con Logisim possiamo simulare un computer che soddisfi le nostre esigenze. Il video qui sopra ti dà un'idea di cosa possiamo realizzare con Logisim.

Per la progettazione del computer, ne ho adattato uno dal mio e-book Kindle Build Your Own Computer - From Scratch. Ho iniziato con il computer BYOC descritto lì e l'ho ridotto al BYOC-I di base variabile (I per Instructable) che useremo in questo Instructable.

Il linguaggio macchina di BYOC-I è semplice e facile da capire. Non avrai bisogno di alcuna conoscenza speciale di computer o programmazione. Tutto ciò che serve è una mente curiosa e il desiderio di imparare

Ulteriori letture

Potresti chiederti perché usiamo "macchina" per descrivere un computer quando non è un dispositivo meccanico. Il motivo è storico; i primi dispositivi informatici erano meccanici costituiti da ingranaggi e ruote. Il testo di Allan Sherman, "Era tutti gli ingranaggi che facevano clic-clac…" era solo un secolo o due. Leggi di più sull'elaborazione iniziale qui.

Passaggio 1: elenco delle parti

Gerarchia e codici del linguaggio macchina
Gerarchia e codici del linguaggio macchina

L'elenco delle parti è breve. Sono richiesti solo questi due elementi, entrambi scaricabili gratuitamente:

  1. "Logisim-win-2.7.1.exe" - Logisim è un simulatore logico popolare e facile da usare. Scarica il file eseguibile Logisim da qui, quindi crea una scorciatoia in un posto comodo come il desktop. Fare doppio clic sull'icona Logisim per avviarlo. Nota: Logisim utilizza il pacchetto Java Runtime che si trova qui. Potrebbe esserti chiesto di scaricarlo.
  2. BYOC-I-Full.cir" - Scarica qui sotto il file del circuito Logisim.

Avvia Logisim, quindi fai clic su "File-Open" e carica il file BYOC-I-Full.cir. L'immagine sopra mostra l'ambiente di lavoro Logisim. Il BYOC-I è rappresentato dal blocco del sottocircuito. Collegati esternamente sono due ingressi, Reset e Run, e display esadecimali per i registri del BYOC-I e la memoria del programma.

La memoria del programma BYOC-I è precaricata con un semplice programma che conta da 1 a 5 nel registro A. Per eseguire (Esegui) il programma, seguire questi passaggi.

Passaggio 1: fare clic sullo strumento Poke. Il cursore dovrebbe cambiare nel "dito" che colpisce. Passaggio 2: premere due volte l'ingresso Reset, una volta modificandolo in "1" e nuovamente per riportarlo a "0". Ciò ripristina il BYOC-I per avviare il programma all'indirizzo 0. Fase 3 - Colpire l'ingresso Run una volta per cambiarlo in "1". Il registro A dovrebbe mostrare il conteggio che cambia da 1 a 5 e poi si ripete. Passaggio 4 - Se il programma non viene eseguito, premere control-K e dovrebbe avviarsi.

Se desideri esplorare le funzionalità di Logisim, fai clic sul collegamento Guida nella barra dei menu. Da lì, puoi esplorare il "Tutorial", la "Guida per l'utente" di Logisim e il "Riferimento alla libreria". Un'eccellente video introduzione si trova qui.

Passaggio 2: gerarchia e codici del linguaggio macchina

Gerarchia e codici del linguaggio macchina
Gerarchia e codici del linguaggio macchina

Il computer BYOC-I esegue compiti basati su programmi scritti in linguaggio macchina. I programmi BYOC-I, a loro volta, sono composti da istruzioni eseguite in una sequenza ben definita. Ogni istruzione è composta da codici a lunghezza fissa che rappresentano vari componenti operativi del BYOC-I. Infine, questi codici sono costituiti da stringhe di 1 e 0 che costituiscono il linguaggio macchina effettivamente eseguito dal BYOC-I.

A titolo di spiegazione, inizieremo con i codici e proseguiremo fino al livello del programma. Quindi codificheremo un semplice programma, lo caricheremo nella memoria del BYOC-I e lo eseguiremo.

I codici sono costituiti da un numero fisso di cifre binarie (1 e 0) o bit, in breve. Ad esempio, la tabella seguente mostra tutti i codici possibili (16 in tutto) per un codice largo 4 bit. A fianco il codice è l'equivalente esadecimale (base 16) e decimale. L'esadecimale viene utilizzato in riferimento ai valori binari in quanto è più compatto del binario e più facile da convertire da binario che decimale. Il prefisso "0x" ti consente di sapere che il numero che segue è esadecimale o "hex" in breve.

Binario - Esadecimale - Decimale0000 0x0000 00001 0x0001 10010 0x0002 20011 0x0003 30100 0x0004 40101 0x0005 50111 0x0007 71000 0x0008 81001 0x0009 91010 0x000A 101011 0x000B 111100 0x000C 121101 15101E 131111 0x000000

La larghezza di un codice determina quanti elementi possono essere rappresentati. Come notato, il codice a 4 bit sopra può rappresentare fino a 16 elementi (da 0 a 15); cioè 2 per 2 preso quattro volte o da 2 a 4a potenza è uguale a 16. In generale, il numero di elementi rappresentabili è 2 elevato all'ennesima potenza. Ecco un breve elenco di capacità di codice a n bit.

n - Numero di articoli1 22 43 84 165 326 647 1288 256

Le larghezze del codice del computer BYOC-I sono scelte per accogliere il numero di elementi da rappresentare dal codice. Ad esempio, ci sono quattro tipi di istruzioni, quindi è adatto un codice a 2 bit. Ecco i codici BYOC-I con una breve spiegazione di ciascuno.

Codice tipo istruzione (tt) Esistono quattro tipi di istruzioni: (1) MVI - Sposta un valore di costante a 8 bit immediato in un registro di memoria. Il registro di memoria è un dispositivo che contiene i dati da utilizzare per un calcolo, (2) MOV - Sposta i dati da un registro all'altro, (3) RRC - Esegue un calcolo da registro a registro e (4) JMP - Salta a un'istruzione diversa invece di continuare con l'istruzione successiva. I codici del tipo di istruzione BYOC-I adottati sono i seguenti:

00 MVI01 MOV10 RRC11 JMP

Codice registro (dd e ss) Il BYOC-I dispone di quattro registri a 8 bit in grado di memorizzare valori da 0 a 255. Un codice a 2 bit è sufficiente per designare i quattro registri:

00 F registro01 E registro10 D registro11 A registro

Codice di calcolo (ccc) Il BYOC-I supporta quattro operazioni aritmetiche/logiche. Per consentire l'espansione futura a otto calcoli, viene utilizzato un codice a 3 bit:

000 ADD, aggiunge due valori a 8 bit nei registri designati e memorizza il risultato in uno dei registri 001 SUB, sottrae due valori a 8 bit nei registri designati e memorizza il risultato in uno dei registri 010 - 011 Riservato per uso futuro100 AND, in modo logico E due valori a 8 bit in registri designati e memorizzare il risultato in uno dei registri101 OPPURE, in modo logico OR due valori a 8 bit in registri designati e memorizzare il risultato in uno dei registri da 110 a 111, Riservato per uso futuro

Codice di salto (j) Un codice a 1 bit che indica se il salto è incondizionato (j = 1) o condizionato a un risultato di calcolo diverso da zero (j = 0).

Dati/Codice indirizzo (v…v)/(a…a) I dati a 8 bit possono essere inclusi in alcune istruzioni che rappresentano valori da 00000000 a 11111111 o da 0 a 255 decimale. Questi dati sono larghi 8 bit per l'archiviazione nei registri a 8 bit di BYOC-I. Con l'aritmetica decimale, non mostriamo gli zeri iniziali. Con l'aritmetica del computer, mostriamo gli zeri iniziali ma non influiscono sul valore. 00000101 è numericamente uguale a 101 o 5 decimali.

Riferimenti suggeriti

Notazione binaria - https://learn.sparkfun.com/tutorials/binaryHexadecimal Notazione -

Ulteriori letture

L'idea di utilizzare codici per guidare un processo risale a molto tempo fa. Un esempio affascinante è il telaio Jacquard. Il telaio automatizzato era comandato da una catena di tessere di legno in cui erano praticati dei fori che rappresentavano codici per filati di diverso colore per la tessitura. Ho visto il mio primo in Scozia dove veniva usato per fare tartan colorati. Leggi di più sui telai Jacquard qui.

Passaggio 3: Anatomia delle istruzioni BYOC-I

Anatomia delle istruzioni BYOC-I
Anatomia delle istruzioni BYOC-I

Dati i codici BYOC-I, passiamo al livello successivo, le istruzioni. Per creare un'istruzione per BYOC-I, mettiamo insieme i codici nell'ordine specificato e in posizioni specifiche all'interno dell'istruzione. Non tutti i codici compaiono in tutte le istruzioni ma, quando lo fanno, occupano una posizione specifica.

Il tipo di istruzione MVI richiede il maggior numero di bit, 12 in tutto. Rendendo la parola di istruzione di 12 bit di lunghezza, accettiamo tutte le istruzioni. Ai bit non utilizzati (i cosiddetti "non importa") viene assegnato il valore 0. Ecco il set di istruzioni BYOC-I.

  1. Move Immediate (MVI) - 00 dd vvvvvvvvFunction: sposta un valore di dati a 8 bit V = vvvvvvvv nel registro di destinazione dd. Dopo l'esecuzione, il registro dd avrà il valore vvvvvvvv. Abbreviazione: MVI R, V dove R è A, D, E o F. Esempio: 00 10 00000101 - MVI D, 5 - Sposta il valore 5 nel registro D.
  2. Move Register to Register (MOV) - 01 dd ss 000000Funzione: sposta i dati dal registro di origine ss al registro di destinazione dd. Dopo l'esecuzione, entrambi i registri hanno lo stesso valore del registro sorgente. Abbreviazione: MOV Rd, Rs dove Rd è il registro di destinazione A, D, E o F e Rs è il registro di origine A, D, E o F. Esempio: 01 11 01 000000 - MOV A, E - Sposta il valore nel registro E al registro A.
  3. Calcolo da registro a registro (RRC) - 10 dd ss ccc 000Funzione: esegue il calcolo designato ccc utilizzando il registro di origine ss e il registro di destinazione dd, quindi memorizzando il risultato nel registro di destinazione. Abbreviazioni: ADD Rd, Rs (ccc=000 Rd + Rs memorizzati in Rd); SUB Rd, Rs (ccc=001 Rd - Rs memorizzato in Rd); AND Rd, Rs (ccc=100 Rd AND Rs memorizzato in Rd); OR Rd, Rs (ccc=101 Rd OR Rs memorizzato in Rd). Esempio: 10 00 11 001 000 - SUB F, A - Sottrarre il valore nel registro A dal registro F con il risultato nel registro F.
  4. Jump to Different Instruction (JMP) - 11 j 0 aaaaaaaaFunzione: Modifica l'esecuzione in un'istruzione diversa situata all'indirizzo aaaa aaaa(a) Incondizionatamente (j=1) -11 1 0 aaaaaaaaAbbreviazione: JMP L dove L è l'indirizzo aaaa aaaaEsempio: 11 1 0 00001000 - JMP 8 - Modifica l'esecuzione all'indirizzo 8.(b) Condizionalmente (j=0) quando il calcolo precedente ha prodotto un risultato diverso da zero - 11 0 0 aaaaaaaaAbbreviazione: JNZ L dove L è l'indirizzo aaaa aaaa. Esempio: 11 0 0 00000100 JNZ 4 Se l'ultimo calcolo ha prodotto un valore diverso da zero, modificare l'esecuzione all'indirizzo 4.

I bit delle parole di istruzione sono numerati da sinistra (bit più significativo MSB) a destra (bit meno significativo LSB) da 11 a 0. L'ordine fisso e le posizioni dei codici sono i seguenti:

Bit - Codice11-10 Tipo di istruzione9-8 Registro di destinazione7-6 Registro di origine5-3 Calcolo: 000 - somma; 001 - sottrarre; 100 - AND logico; 101 - OR7-0 logico Valore costante v…v e a…a (da 0 a 255)

Il set di istruzioni è riassunto nella figura sopra. Notare l'aspetto strutturato e ordinato dei codici in ciascuna istruzione. Il risultato è un design più semplice per il BYOC-I e rende le istruzioni più facili da capire per l'uomo.

Passaggio 4: codifica di un'istruzione per computer

Codificare un'istruzione al computer
Codificare un'istruzione al computer

Prima di passare al livello del programma, costruiamo alcune istruzioni di esempio utilizzando il set di istruzioni BYOC-I sopra.

1. Spostare il valore 1 nel registro A. I registri BYOC-I possono memorizzare valori da 0 a 255. In questo caso, il registro A avrà il valore 1 (00000001 binario) dopo l'esecuzione dell'istruzione.

Abbreviazione: MVI A, 1Codici richiesti: Tipo MVI - 00; Registro di destinazione A - 11; Valore - 00000001Parola di istruzione: 00 11 00000001

2. Spostare il contenuto del registro A nel registro D. Dopo l'esecuzione, entrambi i registri avranno il valore originariamente nel registro A.

Abbreviazione: MOV D, A (Ricorda, la destinazione è la prima e la sorgente la seconda nell'elenco)Codici richiesti: Tipo MOV - 01; Registro di destinazione D - 10; Registro sorgente A - 11 Parola di istruzione: 01 10 11 000000

3. Aggiungere il contenuto del registro D al registro A e memorizzare nel registro A. Dopo l'esecuzione, il valore del registro A sarà la somma del valore originale del registro A e del registro D.

Abbreviazione: ADD A, D (il risultato è memorizzato nel registro di destinazione)Codici richiesti: Tipo RRC - 10; Registro di destinazione A - 11; Registro sorgente D - 10; Calcolo Add - 000Instruction Word: 10 11 10 000 000 (ccc è il primo 000 - add)

4. Salta su non zero all'indirizzo 3. Se il risultato dell'ultimo calcolo non era zero, l'esecuzione passerà all'istruzione all'indirizzo specificato. Se zero, l'esecuzione riprende all'istruzione successiva.

Abbreviazione: JNZ 3Codici richiesti: Tipo JMP - 11; Tipo di salto - 0; Indirizzo - 00000003Parola di istruzione: 11 0 0 00000003 (il tipo di salto è il primo 0)

5. Salta incondizionatamente all'indirizzo 0. Dopo l'esecuzione, l'esecuzione passa all'istruzione all'indirizzo specificato.

Abbreviazione: JMP 0Codice richiesto: Tipo JMP - 11; Tipo di salto - 1; Indirizzo - 00000000 Parola di istruzione; 11 1 0 00000000

Sebbene la codifica della macchina sia in qualche modo noiosa, puoi vedere che non è incredibilmente difficile. Se stessi programmando una macchina per davvero, useresti un programma per computer chiamato assembler per tradurre dall'abbreviazione (che si chiama codice assembly) in codice macchina.

Passaggio 5: anatomia di un programma per computer

Anatomia di un programma per computer
Anatomia di un programma per computer

Un programma per computer è un elenco di istruzioni che il computer esegue a partire dall'inizio dell'elenco e proseguendo lungo l'elenco fino alla fine. Istruzioni come JNZ e JMP possono modificare quale istruzione viene eseguita successivamente. Ogni istruzione nell'elenco occupa un singolo indirizzo nella memoria del computer a partire da 0. La memoria BYOC-I può contenere un elenco di 256 istruzioni, più che sufficienti per i nostri scopi.

I programmi per computer sono progettati per eseguire un determinato compito. Per il nostro programma, sceglieremo un compito semplice, contando da 1 a 5. Ovviamente, non ci sono istruzioni di "conteggio", quindi il primo passo è suddividere il compito in passaggi che possono essere gestiti dal BYOC-I molto set di istruzioni limitato.

Passaggio 1 Spostare 1 per registrare AStep 2 Spostare il registro A per registrare DStep 3 Aggiungere il registro D per registrare A e memorizzare il risultato nel registro AStep 4 Spostare 5 per registrare EStep 5 Sottrarre il registro A dal registro E e memorizzare il risultato nel registro EStep 6 Se il risultato della sottrazione non era zero, torna al passaggio 4 e continua a contare Passaggio 7 Se il risultato della sottrazione era zero, torna indietro e ricomincia

Il passaggio successivo consiste nel tradurre questi passaggi in istruzioni BYOC-I. I programmi BYOC-I iniziano con l'indirizzo 0 e il numero consecutivamente. Gli indirizzi di destinazione del salto vengono aggiunti per ultimi dopo che tutte le istruzioni sono state inserite..

Indirizzo:Istruzioni - Abbreviazione;Descrizione0:00 11 00000001 - MVI A, 1;Sposta 1 nel registro A1:01 10 11 000000 - MOV D, A;Sposta il registro A nel registro D2:10 11 10 000 000 - AGGIUNGI A, D;Aggiungere il registro D al registro A e memorizzare il risultato nel registro A3:00 01 00 00000101 - MVI E, 5;Spostare 5 registro E4:10 01 11 001 000 - SUB E, A;Sottrarre il registro A dal registro E e memorizzare il risultato nel registro E5:11 0 0 00000010 - JNZ 2;Se il risultato della sottrazione è diverso da zero, torna all'indirizzo 3 e continua a contare6:11 1 0 00000000 - JMP 0;Se il risultato della sottrazione è zero, torna indietro e ricomincia

Prima di trasferire il programma in memoria, il codice dell'istruzione binaria deve essere modificato in esadecimale da utilizzare con Logisim Hex Editor. Innanzitutto, dividere l'istruzione in tre gruppi di 4 bit ciascuno. Quindi tradurre i gruppi in esadecimale utilizzando la tabella nel passaggio 2. Verranno utilizzate solo le ultime tre cifre esadecimali (in grassetto sotto).

Indirizzo - Istruzione Binary - Istruzione Binary Split - Istruzione (Hex)0 001100000001 0011 0000 0001 - 0x03011 011011000000 0110 1100 0000 - 0x06C02 101110000000 1011 1000 0000 - 0x0B803 000100000101 0001 0000 0101 - 0x01054 100111001000 1001 1100 1000 - 00010021009 111000000010 1110 0000 0000 - 0x0E00

È ora di trasferire il programma nella memoria del BYOC-I per il test.

Passaggio 6: trasferimento del programma in memoria e test

Trasferimento del programma in memoria e test
Trasferimento del programma in memoria e test
Trasferimento del programma in memoria e test
Trasferimento del programma in memoria e test

Osservando il circuito "principale" di Logisim, il blocco BYOC-I mostrato è il simbolo del circuito del computer effettivo etichettato "BYOC-I" nel riquadro Explorer. Per inserire un programma nella memoria BYOC-I:

  1. Fare clic con il pulsante destro del mouse sul blocco BYOC-I (chiamato "sottocircuito") e selezionare (passare sopra e fare clic con il pulsante sinistro del mouse) "Visualizza BYOC-I".
  2. Il circuito BYOC-I apparirà nell'Area di lavoro. Fare clic con il pulsante destro del mouse sul simbolo "Memoria programma" e selezionare "Modifica contenuto..".
  3. Utilizzando Logisim Hex Editor, inserisci il codice esadecimale (solo in grassetto) come mostrato sopra.

Ora sei pronto per eseguire il programma. Torna al circuito principale facendo doppio clic su "BYOC-I" nel riquadro Explorer. Gli ingressi Run e Reset dovrebbero essere "0" per iniziare. Usando lo strumento Poke, cambia prima Ripristina su "1" e poi di nuovo su "0". Questo rende l'indirizzo iniziale 0x0000 e prepara il circuito BYOC-I per l'esecuzione. Ora colpisci l'input Run su "1" e il programma verrà eseguito. (Nota: è necessario toccare Control-K una volta per avviare l'orologio Logisim. Questa è una funzione che consente di fermare l'orologio Logisim e scorrere un programma toccando ripetutamente Control-T. Provalo qualche volta!)

L'orologio Logisim è impostabile per un'ampia gamma di frequenze. Come scaricato è 8 Hz (8 cicli al secondo). Per come è progettato il computer BYOC-I, ogni istruzione richiede quattro cicli di clock per essere completata. Quindi, per calcolare la velocità BYOC-I, dividere la frequenza di clock per 4. A 8 Hz, la sua velocità è di 2 istruzioni al secondo. È possibile modificare l'orologio facendo clic su "Simula" sulla barra degli strumenti e selezionando "Frequenza tick". L'intervallo possibile è compreso tra 0,25 Hz e 4100 Hz. La velocità lenta a 8 Hz è stata scelta in modo da poter guardare il conteggio nel registro A.

La velocità massima della simulazione BYOC-I (~1000 istruzioni al secondo) è molto lenta rispetto ai computer moderni. La versione hardware del computer BYOC descritta nel mio libro esegue più di 12 milioni di istruzioni al secondo!

Spero che questo Instructable abbia demistificato la programmazione in linguaggio macchina e ti abbia fornito informazioni su come funzionano i computer al loro livello più elementare. Per confermare la tua comprensione, prova a codificare i due programmi di seguito.

  1. Scrivi un programma che inizi da 5 e conti alla rovescia fino a 0. (ANS. Count5to0.txt sotto)
  2. A partire da 2, conta per 3 finché il numero non supera 7. Potresti fare un po' di aritmetica mentale, controlla per 8 sapendo che atterrerà lì e poi ricomincia. Scrivi il tuo programma in un modo più generale che verifichi davvero se il conteggio "supera" un numero specifico. Suggerimento: esplora cosa succede quando una sottrazione produce un valore negativo, ad esempio 8 - 9= -1. Quindi sperimentare con l'AND logico per verificare se l'MSB in un numero a 8 bit è "1". (ANS. ExceedsCount.txt)

Ti vengono in mente altri problemi impegnativi per il computer BYOC-I? Dati i suoi limiti, cosa può fare di più? Condividi le tue esperienze con me a [email protected]. Se sei interessato alla codifica di microprocessori, dai un'occhiata al mio sito Web www.whippleway.com. Lì porto la codifica della macchina su processori moderni come la serie ATMEL Mega utilizzata negli Arduino.

Consigliato: