web-dev-qa-db-fra.com

Différence entre: Opcode, octet code, mnémoniques, code machine et assemblage

Je suis assez nouveau dans ce domaine. J'ai essayé de comprendre clairement la différence entre les termes mentionnés, mais je suis toujours confus. Voici ce que j'ai trouvé:

  • En langage assembleur (ou assembleur) informatique, un mnémonique est l'abréviation d'une opération. Il est entré dans le champ de code d'opération de chaque instruction de programme d'assembleur. par exemple AND AC,37 ce qui signifie AND le AC s'inscrit avec 37. donc AND, SUB et MUL sont mnémoniques. Ils sont traduits par l'assembleur.

  • Les instructions (instructions) en langage assembleur sont généralement très simples, contrairement à celles des langages de programmation de haut niveau. Généralement, un mnémonique est un nom symbolique pour une seule instruction de langage machine exécutable (un opcode), et il existe au moins un mnémonique d'opcode défini pour chaque instruction de langage machine. Chaque instruction se compose généralement d'une opération ou d'un opcode, plus zéro ou plusieurs opérandes.

31
Ahmed Taher

OPCODE : C'est un nombre interprété par votre machine (virtuel ou silicium) qui représente l'opération à effectuer

BYTECODE : Identique au code machine, sauf qu'il est principalement utilisé par un interpréteur logiciel (comme Java ou CLR)

MNÉMONIQUE : Le mot anglais MNEMONIC signifie "Un dispositif tel qu'un motif de lettres, des idées ou des associations qui aide à se souvenir de quelque chose.". Ainsi, il est généralement utilisé par les programmeurs de langage d'assemblage pour se souvenir des "OPÉRATIONS" qu'une machine peut faire, comme "ADD" et "MUL" et "MOV" etc. Ceci est spécifique à l'assembleur.

CODE MACHINE: C'est la séquence de chiffres qui fait basculer les commutateurs de l'ordinateur sous et hors tension pour effectuer un certain travail - comme l'ajout de nombres, la ramification, la multiplication, etc. etc. C'est purement spécifique à la machine et bien documenté par les implémenteurs du processeur.

Assembly: Il y a deux "assemblys" - un programme Assembly est une séquence de mnémoniques et d'opérandes qui sont envoyés à un "assembleur" qui "assemble" les mnémoniques et les opérandes en code machine exécutable. Facultativement, un "éditeur de liens" relie les assemblys et produit un fichier exécutable.

le deuxième "assemblage" dans les langages basés sur "CLR" (langages .NET) est une séquence de code CLR imprégnée d'informations de métadonnées, une sorte de bibliothèque de code exécutable, mais pas directement exécutable.

41
Aniket Inge

Aniket a fait du bon travail, mais j'essaierai aussi.

Tout d'abord, comprenez qu'au niveau le plus bas, les programmes informatiques et toutes les données ne sont que des nombres (parfois appelés mots), en mémoire d'une certaine sorte. Le plus souvent, ces mots sont des multiples de 8 bits (1 et 0) (tels que 32 et 64) mais pas nécessairement, et dans certains processeurs, chaque mot est considérablement plus grand. Quoi qu'il en soit, ce ne sont que des nombres qui sont représentés sous la forme d'une série de 1 et de 0, ou de marche et arrêt si vous le souhaitez. La signification des chiffres dépend de ce que/qui les lit, et dans le cas du processeur, il lit la mémoire un mot à la fois, et en fonction du nombre (instruction) qu'il voit, prend des mesures. Ces actions peuvent inclure la lecture d'une valeur dans la mémoire, l'écriture d'une valeur dans la mémoire, la modification d'une valeur qu'elle a lue, le passage à un autre emplacement dans la mémoire pour lire des instructions.

Au tout début, un programmeur activait et désactivait littéralement les modifications pour modifier la mémoire, avec des voyants allumés ou éteints pour lire les 1 et les 0, car il n'y avait pas de claviers, d'écrans, etc. Au fil du temps, la mémoire s'est agrandie, les processeurs sont devenus plus complexes, des dispositifs d'affichage et des claviers pour la saisie ont été conçus, et avec cela, des façons plus faciles de programmer.

Paraphraser Aniket:

L'OPCODE fait partie d'un mot d'instruction qui est interprété par le processeur comme représentant l'opération à effectuer, telle que lire, écrire, sauter, ajouter. De nombreuses instructions auront également des OPERANDES qui affectent la façon dont l'instruction s'exécute, comme dire d'où dans la mémoire lire ou écrire, ou où aller. Ainsi, si les instructions ont une taille de 32 bits par exemple, un processeur peut utiliser 8 bits pour l'opcode et 12 bits pour chacun des deux opérandes.

À la suite des commutateurs à bascule, le code peut être entré dans une machine à l'aide d'un programme appelé "moniteur". Le programmeur utiliserait des commandes simples pour dire quelle mémoire il souhaite modifier et saisir numériquement le CODE MACHINE, par ex. en base 16 (hex) en utilisant 0 à 9 et A à F pour les chiffres.

Bien que ce soit mieux que de basculer les commutateurs, la saisie du code machine est encore lente et sujette aux erreurs. Un pas de plus est le CODE d'assemblage, qui utilise MNEMONICS plus facilement mémorisé à la place du nombre réel qui représente une instruction. Le travail de l'assembleur est principalement de transformer la forme mnémonique du programme en code machine correspondant. Cela facilite la programmation, en particulier pour les instructions de saut, où une partie de l'instruction est une adresse mémoire vers laquelle sauter ou un nombre de mots à sauter. La programmation en code machine nécessite des calculs minutieux pour formuler les instructions correctes et si du code est ajouté ou supprimé, les instructions de saut peuvent devoir être recalculées. L'assembleur gère cela pour le programmeur.

Cela laisse BYTECODE, qui est fondamentalement le même que le code machine, en ce qu'il décrit les opérations de bas niveau telles que la lecture et l'écriture de la mémoire et les calculs de base. Le bytecode est généralement conçu pour être produit lors de la compilation d'un langage de niveau supérieur, par exemple PHP ou Java, et contrairement au code machine de nombreux processeurs basés sur le matériel, peut avoir des opérations pour prendre en charge des fonctionnalités spécifiques du niveau supérieur Le processeur de bytecode est généralement un programme, bien que des processeurs aient été créés pour interpréter certaines spécifications de bytecode, par exemple un processeur appelé SOAR (Smalltalk On A RISC) pour Smalltalk bytecode. bytecode de code machine, pour certains types de processeurs tels que CISC et EISC (par exemple Linn Rekursiv, des personnes qui ont fait les tourne-disques), le processeur lui-même contient un programme qui interprète les instructions de la machine, il y a donc des parallèles.

29
Nick

La ligne suivante est un code x86 démonté.

68 73 9D 00 01       Push 0x01009D73

68 est le opcode. Avec les octets suivants, cela représente Push instruction of x86 Assembly = langue. L'instruction push pousse les données de longueur de 4 octets (32 bits) à empiler. Le mot Push est juste un mnémonique qui représente l'opcode 68. Chacun des octets 68 , - 73 , 9D , ( 00 , 01 est code machine.

codes machine sont pour les machines réelles (CPU) mais codes octets sont des pseudo codes machine pour les machines virtuelles.

Lorsque vous écrivez un Java. Java compile votre code et génère des codes octets. (Un fichier .class)) et vous pouvez exécuter le même code à tout moment. plate-forme sans changer.

                     Java CODE
                         |
                         |
                     BYTE CODE
         ________________|_______________
         |               |               |
      x86 JVM        SPARC JVM        ARM JVM
         |               |               |
         |               |               |
        x86            SPARC            ARM
   MACHINE CODE     MACHINE CODE    MACHINE CODE
10
Fırat KÜÇÜK

"Assembly" provient des très anciens "assembleurs" de code qui "assemblaient" des programmes à partir de plusieurs fichiers (ce que nous appellerions maintenant des fichiers "include"). (Bien que les "fichiers" soient souvent des jeux de cartes.) L'utilisation du terme "langage d'assemblage" pour désigner une représentation mnémonique du code est une contre-formation de "l'assembleur", et quelque peu imprécise, car un certain nombre de " les assembleurs "ne prennent pas en charge les fichiers include et ne sont donc pas" assemblés ".

Il est intéressant de noter que les "assembleurs" ont été inventés pour supporter les "sous-programmes". Il existait à l'origine des sous-programmes "internes" et "externes". Les sous-programmes "internes" étaient ce que nous appellerions maintenant "en ligne", tandis que ceux "externes" étaient atteints via un mécanisme "d'appel" primitif. Il y avait beaucoup de controverse à l'époque pour savoir si les sous-programmes "externes" étaient une bonne idée ou non.

"Mnémonique" vient du nom du dieu grec Mnémosyne, la déesse de la mémoire. Tout ce qui vous aide à vous souvenir de choses est un "appareil mnémotechnique".

2
Hot Licks

Récemment, j'ai lu un bon article à ce sujet, Différence entre Opcode et Bytecode , j'aime donc partager avec quiconque est après une bonne explication sur ce sujet. Tout le mérite revient à l'auteur original .

Opcode vs Bytecode

  • Opcode :

    Opcode est l'abréviation de code d'opération. Comme son nom l'indique, l'opcode est un type de code qui indique à la machine quoi faire, c'est-à-dire quelle opération effectuer. Opcode est un type d'instruction en langage machine.

  • Bytecode :

    Bytecode est similaire à opcode dans la nature, car il indique également à la machine quoi faire. Cependant, bytecode n'est pas conçu pour être exécuté par le processeur directement, mais plutôt par un autre programme.
    Il est le plus souvent utilisé par un interprète logiciel comme Java ou [~ # ~] clr [~ # ~] . Ils convertissent chaque instruction machine généralisée en une instruction machine spécifique pour que le processeur de l'ordinateur puisse comprendre.
    En fait, le nom bytecode vient de jeux d'instructions qui ont des opcodes à un octet suivis de paramètres facultatifs .

1
Pmpr