Quelle est la différence entre le code objet, le code machine et le code assembleur?
Pouvez-vous donner un exemple visuel de leur différence?
Quelle est la différence entre le code objet, le code machine et le code assembleur?
Pouvez-vous donner un exemple visuel de leur différence?
Réponses:
Le code machine est un code binaire (1 et 0) qui peut être exécuté directement par la CPU. Si vous deviez ouvrir un fichier de code machine dans un éditeur de texte, vous verriez des ordures, y compris des caractères non imprimables (non, pas ces caractères non imprimables;)).
Le code objet est une partie du code machine qui n'a pas encore été liée à un programme complet. C'est le code machine d'une bibliothèque ou d'un module particulier qui constituera le produit terminé. Il peut également contenir des espaces réservés ou des décalages non trouvés dans le code machine d'un programme terminé. L' éditeur de liens utilisera ces espaces réservés et décalages pour tout connecter ensemble.
Le code d'assemblage est un code source en texte clair et (quelque peu) lisible par l'homme qui possède principalement un analogue 1: 1 direct avec des instructions machine. Ceci est accompli en utilisant des mnémoniques pour les instructions réelles, les registres ou d'autres ressources. Les exemples incluent JMP
et MULT
pour les instructions de saut et de multiplication du CPU. Contrairement au code machine, le CPU ne comprend pas le code assembleur. Vous convertissez le code assembleur en machine à l'aide d'un assembleur ou d'un compilateur , bien que nous pensions généralement aux compilateurs en association avec un langage de programmation de haut niveau qui sont plus loin des instructions CPU.
La construction d'un programme complet implique l'écriture du code source du programme dans un assembly ou un langage de niveau supérieur comme C ++. Le code source est assemblé (pour le code assembleur) ou compilé (pour les langages de niveau supérieur) en code objet, et les modules individuels sont liés entre eux pour devenir le code machine du programme final. Dans le cas de programmes très simples, l'étape de liaison peut ne pas être nécessaire. Dans d'autres cas, comme avec un IDE (environnement de développement intégré), l'éditeur de liens et le compilateur peuvent être appelés ensemble. Dans d' autres cas, un compliqué make script ou solution fichier peut être utilisé pour indiquer l'environnement comment construire l'application finale.
Il existe également des langages interprétés qui se comportent différemment. Les langages interprétés reposent sur le code machine d'un programme d'interpréteur spécial. Au niveau de base, un interpréteur analyse le code source et convertit immédiatement les commandes en nouveau code machine et les exécute. Les interprètes modernes, parfois également appelés environnement d'exécution ou machine virtuelle , sont beaucoup plus compliqués: évaluer des sections entières de code source à la fois, mettre en cache et optimiser si possible et gérer des tâches complexes de gestion de la mémoire. Un langage interprété peut également être précompilé en un langage intermédiaire ou un bytecode de niveau inférieur, semblable au code assembleur.
Les autres réponses ont donné une bonne description de la différence, mais vous avez également demandé un visuel. Voici un diagramme montrant qu'ils passent du code C à un exécutable.
Le code d'assemblage est une représentation lisible par l'homme du code machine:
mov eax, 77
jmp anywhere
Le code machine est un code hexadécimal pur:
5F 3A E3 F1
Je suppose que vous voulez dire du code objet comme dans un fichier objet. Il s'agit d'une variante du code machine, à la différence que les sauts sont en quelque sorte paramétrés de sorte qu'un éditeur de liens puisse les remplir.
Un assembleur est utilisé pour convertir le code assembleur en code machine (code objet) Un éditeur de liens relie plusieurs fichiers objet (et bibliothèque) pour générer un exécutable.
J'ai écrit une fois un programme d'assembleur en hexadécimal pur (aucun assembleur disponible) heureusement, c'était bien le bon vieux (ancien) 6502. Mais je suis content qu'il y ait des assembleurs pour les opcodes pentium.
Un point non encore mentionné est qu'il existe différents types de code d'assemblage. Dans la forme la plus élémentaire, tous les nombres utilisés dans les instructions doivent être spécifiés sous forme de constantes. Par exemple:
1902 $: BD 37 14: LDA 1437 $, X 1905 $: 85 03: STA 03 $ 1907 $: 85 09: STA 09 $ 1909 $: CA: DEX 190 $ A: 10 $ BPL 1902 $
Le bit de code ci-dessus, s'il est stocké à l'adresse 1900 $ dans une cartouche Atari 2600, affichera un certain nombre de lignes de différentes couleurs extraites d'une table qui commence à l'adresse 1437 $. Sur certains outils, taper une adresse, ainsi que la partie la plus à droite de la ligne ci-dessus, stockerait en mémoire les valeurs affichées dans la colonne du milieu et commencerait la ligne suivante avec l'adresse suivante. Taper du code sous cette forme était beaucoup plus pratique que taper en hexadécimal, mais il fallait connaître les adresses précises de tout.
La plupart des assembleurs permettent d'utiliser des adresses symboliques. Le code ci-dessus serait écrit plus comme:
rainbow_lp: lda ColorTbl, x sta WSYNC sta COLUBK dex bpl rainbow_lp
L'assembleur ajusterait automatiquement l'instruction LDA afin qu'elle se réfère à n'importe quelle adresse mappée à l'étiquette ColorTbl. L'utilisation de ce style d'assembleur facilite beaucoup l'écriture et la modification du code qu'il ne serait possible si l'on devait saisir et maintenir à la main toutes les adresses.
Code source, code d'assemblage, code machine, code objet, code octet, fichier exécutable et fichier bibliothèque.
Tous ces termes sont souvent très déroutants pour la plupart des gens car ils pensent qu'ils s'excluent mutuellement . Voir le schéma pour comprendre leurs relations. La description de chaque terme est donnée ci-dessous.
Instructions en langage lisible par l'homme (programmation)
Instructions écrites dans un langage (de programmation) de haut niveau
, par exemple les programmes
C, C ++ et Java
Instructions écrites dans un langage d'assemblage (sorte de langage de programmation de bas niveau). Comme première étape du processus de compilation, le code de haut niveau est converti dans ce formulaire. C'est le code assembleur qui est ensuite converti en code machine réel. Sur la plupart des systèmes, ces deux étapes sont effectuées automatiquement dans le cadre du processus de compilation.
par exemple, program.asm
Le produit d'un processus de compilation. Il peut prendre la forme d'un code machine ou d'un code octet.
par exemple, file.o
Instructions en langage machine.
par exemple, a.out
Instruction sous une forme intermédiaire qui peut être exécutée par un interprète tel que JVM.
par exemple, fichier de classe Java
Le produit de la liaison du processus. Ce sont des codes machine qui peuvent être directement exécutés par la CPU.
par exemple, un fichier .exe.
Notez que dans certains contextes, un fichier contenant du code d'octet ou des instructions de langage de script peut également être considéré comme exécutable.
Du code est compilé dans ce formulaire pour différentes raisons telles que la réutilisation et plus tard utilisé par les fichiers exécutables.
cc1
exécutable). Je pense que le cercle asm devrait dépasser du côté gauche du cercle "source", parce que certains asm sont juste asm, pas source. Ce n'est jamais du code objet , bien sûr, mais certains asm sont une étape sur le chemin entre les fichiers source et les fichiers objets.
Le code d'assemblage est discuté ici .
"Un langage d'assemblage est un langage de bas niveau pour la programmation d'ordinateurs. Il implémente une représentation symbolique des codes machine numériques et d'autres constantes nécessaires pour programmer une architecture CPU particulière."
Le code machine est discuté ici .
"Le code machine ou le langage machine est un système d'instructions et de données exécuté directement par l'unité centrale de traitement d'un ordinateur."
Fondamentalement, le code assembleur est le langage et il est traduit en code objet (le code natif que le CPU exécute) par un assembleur (analogue à un compilateur).
Je pense que ce sont les principales différences
La lisibilité peut rendre le code amélioré ou remplacé 6 mois après sa création avec un petit effort, d'autre part, si les performances sont critiques, vous pouvez utiliser un langage de bas niveau pour cibler le matériel spécifique que vous aurez en production, donc pour obtenir exécution plus rapide.
Aujourd'hui, les ordinateurs de l'OMI sont assez rapides pour permettre à un programmeur d'obtenir une exécution rapide avec la POO.
L'assemblage est un terme descriptif court que les humains peuvent comprendre et qui peut être directement traduit dans le code machine qu'un processeur utilise réellement.
Bien que quelque peu compréhensible par les humains, Assembler est toujours de bas niveau. Il faut beaucoup de code pour faire quelque chose d'utile.
Donc, à la place, nous utilisons des langages de niveau supérieur tels que C, BASIC, FORTAN (OK, je sais que je suis sorti avec moi-même). Une fois compilés, ils produisent du code objet. Les premiers langages avaient le langage machine comme code objet.
De nombreux langages aujourd'hui tels que JAVA et C # se compilent généralement en un bytecode qui n'est pas du code machine, mais qui peut être facilement interprété au moment de l'exécution pour produire du code machine.
Les fichiers source de vos programmes sont compilés en fichiers objets, puis l'éditeur de liens relie ces fichiers objets ensemble, produisant un fichier exécutable comprenant les codes machine de votre architecture.
Le fichier objet et le fichier exécutable impliquent le code machine de l'architecture sous la forme de caractères imprimables et non imprimables lorsqu'il est ouvert par un éditeur de texte.
Néanmoins, la dichotomie entre les fichiers est que le ou les fichiers objets peuvent contenir des références externes non résolues (comme printf
, par exemple). Par conséquent, il peut être nécessaire de le lier à d'autres fichiers d'objets. C'est-à-dire que les références externes non résolues doivent être résolues afin d'obtenir le fichier exécutable exécutable décent en établissant une liaison avec d'autres fichiers objets tels que la bibliothèque d'exécution C / C ++. .