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?
Code machine est un code binaire (1 et 0) pouvant être exécuté directement par la CPU. Si vous ouvriez 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;)).
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 composera le produit fini. Il peut également contenir des espaces réservés ou des décalages non trouvés dans le code machine d'un programme terminé. Le éditeur de liens utilisera ces espaces réservés et ces décalages pour tout connecter ensemble.
Code d'assemblage est un code source lisible en texte clair et (quelque peu) humain qui a généralement un analogique 1: 1 direct avec des instructions machine. Ceci est accompli en utilisant des mnémoniques pour les instructions, registres ou autres ressources. Les exemples incluent JMP
et MULT
pour les instructions de saut et de multiplication de la CPU. Contrairement au code machine, la CPU ne comprend pas le code d'assemblage. Vous convertissez le code d'assemblage en machine à l'aide d'un assembleur ou d'un compilateur, bien que nous pensions généralement aux compilateurs associés à un langage de programmation de haut niveau qui sont plus abstraits du Instructions de la CPU.
Construire un programme complet implique d’écrire code source pour le programme en langage Assembly ou dans un langage de niveau supérieur tel que C++. Le code source est assemblé (pour le code d'assemblage) ou compilé (pour les langages de niveau supérieur) en code d'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 script compliqué make ou solution peut être utilisé pour indiquer à l'environnement comment créer l'application finale.
Il y a aussi langages interprétés qui se comportent différemment. Les langues interprétées s'appuient sur le code machine d'un programme d'interprétation spécial. Au niveau de base, un interprète analyse le code source et convertit immédiatement les commandes en nouveau code machine et les exécute. Les interprètes modernes, parfois aussi appelés environnement d'exécution ou machine virtuelle, sont beaucoup plus compliqués: évaluer des parties entières du code source à la fois, mettre en cache et optimiser autant que 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 en bytecode de niveau inférieur, similaire au code d'assemblage.
Les autres réponses décrivent bien la différence, mais vous avez également demandé un visuel. Voici un diagramme montrant leur cheminement 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 entendez le code objet comme dans un fichier objet. C'est une variante du code machine, à la différence que les sauts sont en quelque sorte paramétrés de manière à ce qu'un éditeur de liens puisse les compléter.
Un assembleur est utilisé pour convertir le code d'assembly en code machine (code objet). Un éditeur de liens relie plusieurs fichiers objets (et bibliothèques) pour générer un exécutable.
Une fois, j'ai écrit un programme assembleur en hexadécimal pur (aucun assembleur disponible). Heureusement, c'était un retour sur le bon vieux 6502. Mais je suis heureux qu'il y ait des assembleurs pour les opcodes pentium.
8B 5D 32
est le code machine
mov ebx, [ebp+32h]
is Assembly
lmylib.so
contenant 8B 5D 32
est le code de l'objet
Un point qui n’a pas encore été mentionné est qu’il existe quelques types différents de code Assembly. Dans la forme la plus élémentaire, tous les nombres utilisés dans les instructions doivent être spécifiés en tant que constantes. Par exemple:
1902 $: BD 37 14: ADL 1437 $, X 1905 $: 85 03: STA $ 03 1907 $: 85 09: STA 09 1909 $: CA: DEX 190 $: 10: BPL 1902 $
Le bit de code ci-dessus, s'il est stocké à l'adresse $ 1900 dans une cartouche Atari 2600, affichera un nombre de lignes de couleurs différentes extraites d'une table commençant à l'adresse $ 1437. Sur certains outils, taper une adresse, ainsi que la partie la plus à droite de la ligne ci-dessus, permettrait de stocker en mémoire les valeurs affichées dans la colonne du milieu et de démarrer la ligne suivante avec l'adresse suivante. Taper du code sous cette forme était beaucoup plus pratique que de taper en hexadécimal, mais il fallait connaître les adresses précises de chaque élément.
La plupart des assembleurs permettent d'utiliser des adresses symboliques. Le code ci-dessus serait écrit plutôt:
Rainbow_lp: Lda ColorTbl, x Pour WSYNC Pour COLUBK Dex Bpl Rainbow_lp
L’assembleur ajusterait automatiquement l’instruction LDA afin qu’il se réfère à l’adresse mappée à l’étiquette ColorTbl. En utilisant ce style d'assembleur, il est beaucoup plus facile d'écrire et d'éditer du code que si l'on devait saisir et gérer manuellement toutes les adresses.
Code source, code d'assemblage, code machine, code objet, code octet, fichier exécutable et fichier de bibliothèque.
Tous ces termes sont souvent très déroutants pour la plupart des gens car ils se croient mutuellement exclusifs . 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 haut niveau (programmation)
par exemple, programmes C, C++ et Java
Instructions écrites dans un langage d'assemblage (sorte de langage de programmation bas niveau). Lors de la première étape du processus de compilation, le code de haut niveau est converti sous cette forme. C'est le code d'assemblage 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.
Exemple: programme.
Le produit d'un processus de compilation. Il peut être sous forme de code machine ou de code octet.
Par exemple, fichier.o
Instructions en langage machine.
Par exemple, a.out
Instruction sous une forme intermédiaire pouvant être exécutée par un interpréteur tel que JVM.
Par exemple, Java fichier de classe
Le produit de processus de liaison. Ce sont des codes de machine pouvant être exécutés directement par la CPU.
Par exemple, un fichier .exe.
Notez que dans certains contextes, un fichier contenant des instructions de code octet ou de langage de script peut également être considéré comme exécutable.
Une partie du code est compilée dans ce formulaire pour différentes raisons, telles que la possibilité de le réutiliser, puis l’utilisation ultérieure de fichiers exécutables.
Le code d'assemblage est discuté ici .
"Un langage d'assemblage est un langage de bas niveau utilisé pour programmer des ordinateurs. Il implémente une représentation symbolique des codes de machine numérique et des autres constantes nécessaires pour programmer une architecture de CPU particulière."
Le code machine est discuté ici .
"Le code machine ou langage machine est un système d'instructions et de données exécuté directement par l'unité centrale d'un ordinateur."
Fondamentalement, le code assembleur est le langage et il est traduit en code objet (le code natif exécuté par la CPU) par un assembleur (analogue à un compilateur).
Je pense que ce sont les principales différences
La lisibilité peut améliorer ou remplacer le code 6 mois après sa création avec peu d’effort. Par contre, 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. exécution plus rapide.
Les ordinateurs actuels de l'OMI sont assez rapides pour permettre à un programmeur de s'exécuter rapidement avec la POO.
L'assemblage est un terme descriptif court que les humains peuvent comprendre et qui peut être traduit directement dans le code machine que le processeur utilise réellement.
Bien que ce soit quelque peu compréhensible pour les humains, Assembler reste faible. Il faut beaucoup de code pour faire quelque chose d’utile.
Donc, au lieu de cela, nous utilisons des langages de niveau plus élevé tels que C, BASIC, FORTAN (OK, je sais que je suis sorti avec moi-même). Une fois compilés, ils produisent un code objet. Les premières langues avaient le langage machine comme code objet.
Aujourd'hui, de nombreux langages tels que Java et C # se compilent généralement en un pseudo-code qui n'est pas un code machine, mais qui peut être facilement interprété au moment de l'exécution pour générer du code machine.