Table des matières:

Coder et tester un ordinateur en langage machine : 6 étapes
Coder et tester un ordinateur en langage machine : 6 étapes

Vidéo: Coder et tester un ordinateur en langage machine : 6 étapes

Vidéo: Coder et tester un ordinateur en langage machine : 6 étapes
Vidéo: Les Bases de la Programmation | Comment créer un Programme informatique ? 2024, Novembre
Anonim
Image
Image

Dans ce Instructable, je vais vous montrer comment coder et tester un programme informatique en langage machine. Le langage machine est le langage natif des ordinateurs. Parce qu'il est composé de chaînes de 1 et de 0, il n'est pas facilement compris par les humains. Pour contourner ce problème, nous codons d'abord les programmes dans un langage de haut niveau comme C++ ou Java, puis utilisons des programmes informatiques spéciaux pour les traduire dans les 1 et les 0 que les ordinateurs comprennent. Apprendre à coder dans un langage de haut niveau est certainement une évidence, mais une brève introduction au langage machine peut fournir des informations précieuses sur le fonctionnement des ordinateurs et accroître l'appréciation de cette technologie très importante.

Pour coder et tester un programme en langage machine, nous avons besoin d'accéder à un ordinateur simple dont le langage machine est facilement compris. Les ordinateurs personnels sont bien trop complexes pour être pris en compte. La solution consiste à utiliser Logisim, un simulateur logique, qui s'exécute sur un ordinateur personnel. Avec Logisim, nous pouvons simuler un ordinateur qui répond à nos besoins. La vidéo ci-dessus vous donne une idée de ce que nous pouvons accomplir avec Logisim.

Pour la conception informatique, j'en ai adapté un de mon livre électronique Kindle Build Your Own Computer - From Scratch. J'ai commencé avec l'ordinateur BYOC qui y est décrit et je l'ai réduit au BYOC-I de base variable (I pour Instructable) que nous utiliserons dans ce Instructable.

Le langage machine de BYOC-I est simple et facile à comprendre. Vous n'aurez pas besoin de connaissances particulières en informatique ou en programmation. Tout ce qu'il faut, c'est un esprit curieux et le désir d'apprendre

Lectures complémentaires

Vous vous demandez peut-être pourquoi nous utilisons le mot "machine" pour décrire un ordinateur alors qu'il ne s'agit pas d'un appareil mécanique. La raison est historique; les premiers appareils informatiques étaient mécaniques constitués d'engrenages et de roues. Les paroles d'Allan Sherman, "C'était tous les engrenages qui allaient clic-clac…" n'étaient que d'un siècle ou deux. En savoir plus sur l'informatique précoce ici.

Étape 1: Liste des pièces

Hiérarchie et codes du langage machine
Hiérarchie et codes du langage machine

La liste des pièces est courte. Seuls ces deux éléments sont obligatoires, tous deux téléchargeables gratuitement:

  1. "Logisim-win-2.7.1.exe" - Logisim est un simulateur logique populaire et facile à utiliser. Téléchargez le fichier exécutable Logisim à partir d'ici, puis créez un raccourci dans un endroit pratique comme votre bureau. Double-cliquez sur l'icône Logisim pour le lancer. Remarque: Logisim utilise Java Runtime Package situé ici. Il vous sera peut-être demandé de le télécharger.
  2. BYOC-I-Full.cir" - Téléchargez le fichier du circuit Logisim ci-dessous.

Lancez Logisim puis cliquez sur "File-Open" et chargez le fichier BYOC-I-Full.cir. L'image ci-dessus montre l'environnement de travail de Logisim. Le BYOC-I est représenté par le bloc de sous-circuit. Deux entrées, Reset et Run, et des affichages hexadécimaux pour les registres et la mémoire de programme du BYOC-I sont connectés en externe.

La mémoire de programme du BYOC-I est pré-chargée avec un programme simple qui compte de 1 à 5 dans le registre A. Pour exécuter (Exécuter) le programme, procédez comme suit.

Étape 1 - Cliquez sur l'outil Poke. Le curseur doit se transformer en « doigt » qui pique. Étape 2 - Appuyez deux fois sur l'entrée de réinitialisation, une fois en la changeant en "1" et de nouveau pour la remettre en "0". Cela réinitialise le BYOC-I pour démarrer le programme à l'adresse 0. Étape 3 - Appuyez une fois sur l'entrée Run pour la changer à "1". Le registre A devrait afficher le compte changeant de 1 à 5 puis se répétant. Étape 4 - Si le programme ne s'exécute pas, appuyez sur Ctrl-K et il devrait démarrer.

Si vous souhaitez explorer les capacités de Logisim, cliquez sur le lien Aide dans la barre de menus. À partir de là, vous pouvez explorer le « Tutoriel », le « Guide de l'utilisateur » et la « Référence de la bibliothèque » de Logisim. Une excellente introduction vidéo se trouve ici.

Étape 2: Hiérarchie et codes du langage machine

Hiérarchie et codes du langage machine
Hiérarchie et codes du langage machine

L'ordinateur BYOC-I effectue des tâches basées sur des programmes écrits en langage machine. Les programmes BYOC-I, quant à eux, sont composés d'instructions exécutées dans une séquence bien définie. Chaque instruction est composée de codes de longueur fixe qui représentent divers composants opérationnels du BYOC-I. Enfin, ces codes sont constitués de chaînes de 1 et de 0 qui constituent le langage machine que le BYOC-I exécute réellement.

En guise d'explication, nous allons commencer par les codes et progresser jusqu'au niveau du programme. Ensuite, nous allons coder un programme simple, le charger dans la mémoire du BYOC-I et l'exécuter.

Les codes se composent d'un nombre fixe de chiffres ou de bits binaires (1 et 0), en abrégé. Par exemple, le tableau ci-dessous présente tous les codes possibles (16 en tout) pour un code de 4 bits de large. Le code affiché à côté est l'équivalent hexadécimal (base 16) et décimal. L'hexadécimal est utilisé pour faire référence aux valeurs binaires car il est plus compact que binaire et plus facile à convertir à partir de binaire que de décimal. Le préfixe "0x" vous permet de savoir que le nombre qui suit est hexadécimal ou "hex" pour faire court.

Binaire - Hexadécimal - Décimal0000 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 141110 0x000F

La largeur d'un code détermine le nombre d'éléments pouvant être représentés. Comme indiqué, le code large de 4 bits ci-dessus peut représenter jusqu'à 16 éléments (0 à 15); c'est-à-dire 2 fois 2 pris quatre fois ou 2 à la puissance 4 égale 16. En général, le nombre d'éléments représentables est de 2 élevé à la puissance n. Voici une courte liste des capacités de code à n bits.

n - Nombre d'articles1 22 43 84 165 326 647 1288 256

Les largeurs de code informatique BYOC-I sont choisies pour s'adapter au nombre d'éléments à représenter par le code. Par exemple, il existe quatre types d'instructions, donc un code large de 2 bits convient. Voici les codes BYOC-I avec une brève explication de chacun.

Code de type d'instruction (tt) Il existe quatre types d'instructions: (1) MVI - Déplace une valeur constante de 8 bits immédiate dans un registre de mémoire. Le registre de mémoire est un dispositif qui contient des données à utiliser pour un calcul, (2) MOV - Déplacer des données d'un registre à un autre, (3) RRC - Effectuer un calcul de registre à registre, et (4) JMP - Sauter à une instruction différente au lieu de continuer à l'instruction suivante. Les codes de type d'instruction BYOC-I adoptés sont les suivants:

00 MVI01 MOV10 RRC11 JMP

Code de registre (dd et ss) Le BYOC-I dispose de quatre registres de 8 bits capables de stocker des valeurs de 0 à 255. Un code de 2 bits suffit pour désigner les quatre registres:

00 Registre F01 Registre E10 Registre D11 Registre A

Code de calcul (ccc) Le BYOC-I prend en charge quatre opérations arithmétiques/logiques. Pour permettre une extension future à huit calculs, un code à 3 bits est utilisé:

000 AJOUTER, ajouter deux valeurs de 8 bits dans des registres désignés et stocker le résultat dans l'un des registres 001 SUB, soustraire deux valeurs de 8 bits dans des registres désignés et stocker le résultat dans l'un des registres 010 - 011 Réservé pour une utilisation future100 ET, logiquement ET deux valeurs de 8 bits dans des registres désignés et stocke le résultat dans l'un des registres101 OU, logiquement OU deux valeurs de 8 bits dans des registres désignés et stocke le résultat dans l'un des registres 110 à 111, Réservé pour une utilisation future

Jump Code (j) Un code à 1 bit qui indique si le saut est inconditionnel (j = 1) ou conditionné à un résultat de calcul différent de zéro (j = 0).

Données/Code d'adresse (v…v)/(a…a) Des données de 8 bits peuvent être incluses dans certaines instructions représentant des valeurs de 00000000 à 11111111 ou de 0 à 255 décimal. Ces données ont une largeur de 8 bits pour le stockage dans les registres 8 bits de BYOC-I. Avec l'arithmétique décimale, nous n'affichons pas de zéros non significatifs. Avec l'arithmétique informatique, nous affichons des zéros non significatifs mais ils n'affectent pas la valeur. 00000101 est numériquement identique à 101 ou 5 décimales.

Références suggérées

Notation binaire - https://learn.sparkfun.com/tutorials/binaryHexadecimal Notation -

Lectures complémentaires

L'idée d'utiliser des codes pour piloter un processus remonte à loin. Un exemple fascinant est le métier à tisser Jacquard. Le métier à tisser automatisé était contrôlé par une chaîne de cartes en bois dans lesquelles des trous étaient percés représentant les codes des fils de différentes couleurs pour le tissage. J'ai vu mon premier en Ecosse où il était utilisé pour faire des tartans colorés. En savoir plus sur les métiers à tisser Jacquard ici.

Étape 3: Anatomie des instructions BYOC-I

Anatomie des instructions BYOC-I
Anatomie des instructions BYOC-I

Compte tenu des codes du BYOC-I, nous passons au niveau suivant, les instructions. Pour créer une instruction pour le BYOC-I, nous plaçons les codes ensemble dans un ordre spécifié et à des emplacements spécifiques dans l'instruction. Tous les codes n'apparaissent pas dans toutes les instructions mais, lorsqu'ils le font, ils occupent un emplacement spécifique.

Le type d'instruction MVI requiert le plus de bits, 12 en tout. En faisant en sorte que le mot d'instruction ait une longueur de 12 bits, nous accommodons toutes les instructions. Les bits inutilisés (appelés "ne s'en soucient pas") reçoivent la valeur 0. Voici le jeu d'instructions BYOC-I.

  1. Déplacer immédiatement (MVI) - 00 dd vvvvvvvvFunction: Déplacer une valeur de données de 8 bits V = vvvvvvvv vers le registre de destination dd. Après exécution, le registre dd aura la valeur vvvvvvvv. Abréviation: MVI R, V où R est A, D, E ou F. Exemple: 00 10 00000101 - MVI D, 5 - Déplacer la valeur 5 dans le registre D.
  2. Déplacer le registre vers le registre (MOV) - 01 dd ss 000000Fonction: Déplacer les données du registre source ss vers le registre de destination dd. Après exécution, les deux registres ont la même valeur que le registre source. Abréviation: MOV Rd, Rs où Rd est le registre de destination A, D, E ou F et Rs est le registre source A, D, E ou F. Exemple: 01 11 01 000000 - MOV A, E - Déplace la valeur dans le registre E au registre A.
  3. Calcul de registre à registre (RRC) - 10 dd ss ccc 000Fonction: effectuez le calcul désigné ccc à l'aide du registre source ss et du registre de destination dd, puis stockez le résultat dans le registre de destination. Abréviations: AJOUTEZ Rd, Rs (ccc=000 Rd + Rs stockés dans Rd); SUB Rd, Rs (ccc=001 Rd - Rs stocké dans Rd); ET Rd, Rs (ccc=100 Rd ET Rs stockés dans Rd); OU Rd, Rs (ccc=101 Rd OU Rs stocké dans Rd). Exemple: 10 00 11 001 000 - SUB F, A - Soustraire la valeur dans le registre A du registre F avec le résultat dans le registre F.
  4. Jump to Different Instruction (JMP) - 11 j 0 aaaaaaaaFunction: Changer l'exécution pour une instruction différente située à l'adresse aaaa aaaa(a) Unconditionally (j=1) -11 1 0 aaaaaaaaAbréviation: JMP L où L est l'adresse aaaa aaaaExemple: 11 1 0 00001000 - JMP 8 - Modification de l'exécution à l'adresse 8.(b) Conditionnellement (j=0) lorsque le calcul précédent a donné un résultat non nul - 11 0 0 aaaaaaaaAbréviation: JNZ L où L est l'adresse aaaa aaaa. Exemple: 11 0 0 00000100 JNZ 4 Si le dernier calcul a donné une valeur différente de zéro, modifiez l'exécution à l'adresse 4.

Les bits du mot d'instruction sont numérotés de la gauche (bit le plus significatif MSB) à la droite (bit le moins significatif LSB) de 11 à 0. L'ordre fixe et les emplacements des codes sont les suivants:

Bits - Code11-10 Type d'instruction9-8 Registre de destination7-6 Registre de source5-3 Calcul: 000 - ajouter; 001 - soustraire; 100 - ET logique; 101 - logique OR7-0 Valeur constante v…v et a…a (0 à 255)

Le jeu d'instructions est résumé dans la figure ci-dessus. Notez l'apparence structurée et ordonnée des codes dans chaque instruction. Le résultat est une conception plus simple pour le BYOC-I et il rend les instructions plus faciles à comprendre pour l'homme.

Étape 4: coder une instruction informatique

Codage d'une instruction informatique
Codage d'une instruction informatique

Avant de passer au niveau du programme, construisons quelques exemples d'instructions en utilisant le jeu d'instructions BYOC-I ci-dessus.

1. Déplacez la valeur 1 vers le registre A. Les registres BYOC-I peuvent stocker des valeurs de 0 à 255. Dans ce cas, le registre A aura la valeur 1 (00000001 binaire) après exécution de l'instruction.

Abréviation: MVI A, 1Codes requis: Type MVI - 00; Registre de destination A - 11; Valeur - 00000000 Mot d'instruction: 00 11 0000001

2. Déplacez le contenu du registre A vers le registre D. Après exécution, les deux registres auront la valeur d'origine dans le registre A.

Abréviation: MOV D, A (N'oubliez pas que la destination est la première et la source la deuxième dans la liste) Codes requis: Tapez MOV - 01; Registre de destination D - 10; Registre source A - 11Mot d'instruction: 01 10 11 000000

3. Ajoutez le contenu du registre D au registre A et stockez-le dans le registre A. Après exécution, la valeur du registre A sera la somme de la valeur d'origine du registre A et du registre D.

Abréviation: AJOUTER A, D (le résultat est stocké dans le registre de destination) Codes requis: Type RRC - 10; Registre de destination A - 11; Registre source D - 10; Calcul Add - 000Instruction Word: 10 11 10 000 000 (ccc est le premier 000 - ajouter)

4. Saut sur non zéro à l'adresse 3. Si le résultat du dernier calcul n'était pas zéro, l'exécution passera à l'instruction à l'adresse donnée. Si zéro, l'exécution reprend à l'instruction suivante.

Abréviation: JNZ 3Codes requis: Tapez JMP - 11; Type de saut - 0; Adresse - 00000003Mot d'instruction: 11 0 0 00000003 (Le type de saut est le premier 0)

5. Saut inconditionnel à l'adresse 0. Après l'exécution, l'exécution passe à l'instruction à l'adresse donnée.

Abréviation: JMP 0Code Obligatoire: Tapez JMP - 11; Type de saut - 1; Adresse - 00000000Mot d'instruction; 11 1 0 00000000

Bien que le codage machine soit quelque peu fastidieux, vous pouvez voir que ce n'est pas incroyablement difficile. Si vous faisiez du codage machine pour de vrai, vous utiliseriez un programme informatique appelé assembleur pour traduire l'abréviation (appelée code assembleur) en code machine.

Étape 5: Anatomie d'un programme informatique

Anatomie d'un programme informatique
Anatomie d'un programme informatique

Un programme informatique est une liste d'instructions que l'ordinateur exécute en commençant au début de la liste et en descendant la liste jusqu'à la fin. Des instructions telles que JNZ et JMP peuvent changer l'instruction à exécuter ensuite. Chaque instruction de la liste occupe une seule adresse dans la mémoire de l'ordinateur à partir de 0. La mémoire BYOC-I peut contenir une liste de 256 instructions, plus que suffisante pour nos besoins.

Les programmes informatiques sont conçus pour effectuer une tâche donnée. Pour notre programme, nous choisirons une tâche simple, en comptant de 1 à 5. Évidemment, il n'y a pas d'instruction "compter", donc la première étape consiste à décomposer la tâche en étapes qui peuvent être gérées par les BYOC-I très jeu d'instructions limité.

Étape 1 Déplacez 1 vers le registre A Étape 2 Déplacez le registre A vers le registre DS Étape 3 Ajoutez le registre D au registre A et stockez le résultat dans le registre A Étape 4 Déplacez 5 vers le registre ES Étape 5 Soustrayez le registre A du registre E et stockez le résultat dans le registre ES Étape 6 Si le résultat de la soustraction n'était pas égal à zéro, revenez à l'étape 4 et continuez à compterÉtape 7 Si le résultat de la soustraction était égal à zéro, revenez en arrière et recommencez

L'étape suivante consiste à traduire ces étapes en instructions BYOC-I. Les programmes BYOC-I commencent à l'adresse 0 et numérotent consécutivement. Les adresses des cibles de saut sont ajoutées en dernier une fois que toutes les instructions sont en place.

Adresse:Instruction - Abréviation;Description0:00 11 00000001 - MVI A, 1;Déplacer 1 vers le registre A1:01 10 11 000000 - MOV D, A;Déplacer le registre A vers le registre D2:10 11 10 000 000 - AJOUTER A, D;Ajouter le registre D au registre A et mémoriser le résultat dans le registre A3:00 01 00 00000101 - MVI E, 5;Déplacer 5 registre E4:10 01 11 001 000 - SUB E, A;Soustraire le registre A du registre E et mémoriser le résultat dans le registre E5:11 0 0 00000000 - JNZ 2;Si le résultat de la soustraction n'était pas nul, revenir à l'adresse 3 et continuer à compter6:11 1 0 00000000 - JMP 0;Si le résultat de la soustraction était nul, revenir en arrière et recommencer

Avant de transférer le programme en mémoire, le code d'instruction binaire doit être changé en hexadécimal à utiliser avec l'éditeur hexadécimal Logisim. Tout d'abord, divisez l'instruction en trois groupes de 4 bits chacun. Traduisez ensuite les groupes en hexadécimal à l'aide du tableau de l'étape 2. Seuls les trois derniers chiffres hexadécimaux (en gras ci-dessous) seront utilisés.

Adresse - Instruction Binaire - Instruction Binaire Split - Instruction (Hex) 0 001100000001 0011 0000 0001 - 0x03011 011011000000 0110 1100 0000 - 0x06C02 101110000000 1011 1000 0000 - 0x0B803 000100000101 0001 0000 0101 - 0x01054 10011100000 0001 0001 - 1100 1000 0000 - 0x0B803 000100000101 0001 0000 0101 - 0x01054 100111000000 0001 0001 - 1100 1000 111000000010 1110 0000 0000 - 0x0E00

Il est temps de transférer le programme dans la mémoire du BYOC-I pour le tester.

Étape 6: Transfert du programme en mémoire et test

Transfert du programme en mémoire et test
Transfert du programme en mémoire et test
Transfert du programme en mémoire et test
Transfert du programme en mémoire et test

En regardant le circuit "principal" de Logisim, le bloc BYOC-I affiché est le symbole du circuit informatique réel étiqueté "BYOC-I" dans le volet de l'explorateur. Pour entrer un programme dans la mémoire BYOC-I:

  1. Cliquez avec le bouton droit sur le bloc BYOC-I (appelé "sous-circuit") et sélectionnez (survolez et cliquez avec le bouton gauche) "Afficher BYOC-I".
  2. Le circuit BYOC-I apparaîtra dans la zone de travail. Faites un clic droit sur le symbole "Program Memory" et sélectionnez "Edit Contents…".
  3. À l'aide de l'éditeur hexadécimal Logisim, entrez le code hexadécimal (en gras uniquement) comme indiqué ci-dessus.

Vous êtes maintenant prêt à exécuter le programme. Revenez au circuit principal en double-cliquant sur "BYOC-I" dans le volet de l'explorateur. Les entrées Run et Reset doivent être à "0" pour démarrer. À l'aide de l'outil Poke, remplacez d'abord Reset par "1", puis de nouveau sur "0". Cela rend l'adresse de départ 0x0000 et prépare le circuit BYOC-I pour l'exécution. Maintenant, placez l'entrée Run sur "1" et le programme s'exécutera. (Remarque: vous devez principalement appuyer sur Control-K une fois pour démarrer l'horloge Logisim. Il s'agit d'une fonctionnalité qui vous permet d'arrêter l'horloge Logisim et de parcourir un programme en appuyant plusieurs fois sur Control-T. Essayez-le de temps en temps !)

L'horloge Logisim est réglable pour une large gamme de fréquences. Comme téléchargé, il est de 8 Hz (8 cycles par seconde). La façon dont l'ordinateur BYOC-I est conçu, chaque instruction prend quatre cycles d'horloge pour se terminer. Ainsi, pour calculer la vitesse BYOC-I, divisez la fréquence d'horloge par 4. A 8 Hz, sa vitesse est de 2 instructions par seconde. Vous pouvez changer l'horloge en cliquant sur "Simuler" dans la barre d'outils et en sélectionnant "Tick Frequency". La plage possible est de 0,25 Hz à 4 100 Hz. La vitesse lente à 8 Hz a été choisie pour que vous puissiez regarder le décompte dans le registre A.

La vitesse maximale de la simulation BYOC-I (~1000 instructions par seconde) est très lente par rapport aux ordinateurs modernes. La version matérielle de l'ordinateur BYOC décrit dans mon livre s'exécute à plus de 12 millions d'instructions par seconde !

J'espère que cet Instructable a démystifié la programmation en langage machine et vous a donné un aperçu du fonctionnement des ordinateurs à leur niveau le plus élémentaire. Pour renforcer votre compréhension, essayez de coder les deux programmes ci-dessous.

  1. Écrivez un programme qui commence à 5 et compte à rebours jusqu'à 0. (ANS. Count5to0.txt ci-dessous)
  2. En commençant à 2, comptez par 3 jusqu'à ce que le nombre dépasse 7. Vous pouvez faire un peu de calcul mental, vérifier 8 en sachant qu'il atterrirait là puis redémarrez. Écrivez votre programme d'une manière plus générale qui teste vraiment si le nombre "dépasse" un nombre spécifique. Astuce: Explorez ce qui se passe lorsqu'une soustraction donne une valeur négative, disons 8 - 9 = -1 par exemple. Expérimentez ensuite avec le ET logique pour tester si le MSB dans un nombre à 8 bits est "1". (ANS. ExceedsCount.txt)

Pouvez-vous penser à d'autres problèmes difficiles pour l'ordinateur BYOC-I ? Compte tenu de ses limites, que peut-il faire de plus ? Partagez vos expériences avec moi à [email protected]. Si vous êtes intéressé par le codage de microprocesseurs, consultez mon site Web www.whippleway.com. Là, je transporte le codage machine vers des processeurs modernes comme la série ATMEL Mega utilisée dans Arduinos.

Conseillé: