243 votes

Code assembleur, code machine ou code objet ?

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 ?

0 votes

Je suis également curieux de savoir d'où vient le nom "code objet" ? Qu'est-ce que le mot "objet" est censé signifier ? Est-ce que c'est lié à la programmation orientée objet ou juste une coïncidence de noms ?

0 votes

@SasQ : Code objet .

0 votes

Je ne demande pas ce qu'est un code objet, Capitaine Evidence. Je demande d'où vient le nom et pourquoi on l'appelle code "objet".

319voto

Joel Coehoorn Points 190579

Code machine est un code binaire (1 et 0) qui peut être exécuté directement par l'unité centrale. Si vous ouvrez un fichier de code machine dans un éditeur de texte, vous verrez des déchets, y compris des caractères non imprimables (non, pas ceux caractères non imprimables ;) ).

Code objet est une partie du code machine qui n'est pas encore liée à un programme complet. C'est le code machine d'une bibliothèque ou d'un module particulier qui constituera le produit fini. Il peut également contenir des espaces réservés ou des décalages qui ne se trouvent pas dans le code machine d'un programme complet. Le site linker utilisera ces espaces et ces décalages pour tout relier entre eux.

Code d'assemblage est un code source en texte clair et (plus ou moins) lisible par l'homme, qui présente principalement une analogie directe 1:1 avec les instructions machine. Ceci est réalisé en utilisant des mnémoniques pour les instructions, registres ou autres ressources. Voici quelques exemples JMP y 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 code machine à l'aide d'un programme assembleur ou un compilateur Les compilateurs sont généralement associés à des langages de programmation de haut niveau qui sont plus abstraits que les instructions du processeur.


La construction d'un programme complet implique l'écriture code source pour le programme, soit en assembleur, soit dans un langage de plus haut niveau comme le C++. Le code source est assemblé (pour le code d'assemblage) 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, par exemple avec un IDE (environnement de développement intégré), l'éditeur de liens et le compilateur peuvent être invoqués ensemble. Dans d'autres cas, un programme compliqué faire script ou solution peut être utilisé pour indiquer à l'environnement comment construire l'application finale.

Il existe également les langues interprétées qui se comportent différemment. Les langages interprétés reposent sur le code machine d'un programme 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 sont aujourd'hui beaucoup plus complexes : ils évaluent des sections entières du code source à la fois, mettent en cache et optimisent lorsque cela est possible, et gèrent des tâches complexes de gestion de la mémoire.

Enfin, un dernier type de programme implique l'utilisation d'une environnement d'exécution ou machine virtuelle . Dans cette situation, un programme est d'abord précompilé dans un format de plus bas niveau langue intermédiaire ou code d'octet . Le code d'octet est ensuite chargé par la machine virtuelle, qui le compile juste à temps en code natif. L'avantage ici est que la machine virtuelle peut tirer parti des optimisations disponibles au moment où le programme s'exécute et pour cet environnement spécifique. Un compilateur appartient au développeur, et doit donc produire un code machine relativement générique (moins optimisé) qui pourrait s'exécuter dans de nombreux endroits. L'environnement d'exécution ou la machine virtuelle, en revanche, se trouve sur l'ordinateur de l'utilisateur final et peut donc tirer parti de toutes les fonctionnalités fournies par ce système.

25 votes

+1 : bonne réponse, mais quelque peu simplificatrice - toutes les instructions d'assemblage ne sont pas traduites 1:1 en instructions machine, et les fichiers objets peuvent également contenir d'autres données (informations de relocalisation, tables de symboles, ...).

5 votes

J'ai ajouté un mot-clé pour le premier numéro, j'ai modifié le deuxième pour le rendre plus clair.

2 votes

@Christoph : vous dites "toutes les instructions d'assemblage ne sont pas traduites 1:1 en instructions machine" merci de donner un exemple.

134voto

Graphics Noob Points 4004

Les autres réponses donnaient une bonne description de la différence, mais vous avez également demandé un visuel. Voici un diagramme montrant le cheminement du code C vers un exécutable.

3 votes

Je trouve cela très utile, mais il manque l'étiquette "Code machine".

0 votes

Donc, quand c'est au niveau du code exécutable, c'est équivalent au code machine ?

3 votes

Dans le contexte de ce diagramme, le "code objet" est le code machine.

51voto

Toon Krijthe Points 36327

Le code assembleur 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 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 telle sorte qu'un éditeur de liens peut les remplir.

Un assembleur est utilisé pour convertir le code d'assemblage en code machine (code objet). Un éditeur de liens relie plusieurs fichiers objets (et bibliothèques) pour générer un exécutable.

J'ai une fois écrit un programme assembleur en hexadécimal pur (pas d'assembleur disponible), heureusement c'était il y a longtemps sur le bon vieux (ancien) 6502. Mais je suis content qu'il y ait des assembleurs pour les opcodes du Pentium.

79 votes

Non non non non. Le code machine n'est pas du code hexadécimal. C'est du pur binaire. Le code hexadécimal est juste une représentation pratique du binaire.

59 votes

Si on veut vraiment aller dans les extrêmes, ce n'est pas binaire, c'est une quantité d'électricité stockée dans un circuit ;-)

0 votes

@Breton : il est certainement possible d'écrire un programme binaire en utilisant un éditeur hexadécimal. Bien sûr, les chiffres hexadécimaux saisis correspondront aux instructions et aux données prévues. C'est compliqué mais faisable. Je l'ai utilisé pour Parcheando des images binaires (firmware) avec des corrections de bogues. Je préfère cependant avoir un peu plus que l'éditeur hexagonal :-)

19voto

Quassnoi Points 191041

8B 5D 32 est un code machine

mov ebx, [ebp+32h] est l'assemblage

lmylib.so contenant 8B 5D 32 est un code objet

0 votes

Le code hexadécimal n'est pas vraiment du code machine, c'est juste une façon plus simple de le représenter.

0 votes

Je pense que c'est juste le binaire qui est traduit en différentes quantités d'électricité, je ne suis pas sûr. Je sais juste que l'hexagone n'est pas un code machine réel, c'est comme représenter le C++ avec la langue anglaise.

8voto

supercat Points 25534

Un point qui n'a pas encore été mentionné est qu'il existe plusieurs types différents de code d'assemblage. Dans la forme la plus élémentaire, tous les nombres utilisés dans les instructions doivent être spécifiés comme des constantes. Par exemple :

$1902: BD 37 14 : LDA $1437,X
$1905: 85 03    : STA $03
$1907: 85 09    : STA $09
$1909: CA       : DEX
$190A: 10       : BPL $1902

Le bout 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, le fait de taper une adresse, ainsi que la partie la plus à droite de la ligne ci-dessus, permettait de stocker en mémoire les valeurs affichées dans la colonne du milieu et de commencer 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 tout.

La plupart des assembleurs permettent d'utiliser des adresses symboliques. Le code ci-dessus serait plutôt écrit comme suit :

rainbow\_lp:
  lda ColorTbl,x
  sta WSYNC
  sta COLUBK
  dex
  bpl rainbow\_lp

L'assembleur ajusterait automatiquement l'instruction LDA pour qu'elle se réfère à n'importe quelle adresse mappée à l'étiquette ColorTbl. L'utilisation de ce style d'assembleur rend l'écriture et l'édition du code beaucoup plus faciles que si l'on devait saisir et maintenir manuellement toutes les adresses.

1 votes

+1. Un point supplémentaire : il existe également différents langages d'assemblage. syntaxes le plus célèbre étant Intel et AT&T .

1 votes

@informatik01 : Que pensez-vous des mnémoniques Intel 8080 vs Zilog Z80 ? Je pense que c'est antérieur à la guerre syntaxique Intel vs AT&T.

0 votes

Je ne discute pas, j'ai juste mentionné cet aspect (syntaxe différente) et donné un exemple des deux syntaxes les plus populaires/ connues/ célèbres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X