Pour répondre à vos questions, veuillez noter que c'est subjectif car il existe différents processeurs, différentes plateformes, différents assembleurs et compilateurs C, dans ce cas, je parlerai de la plateforme Intel x86.
- Les assembleurs n'assemblent généralement pas en binaire pur / plat (code machine brut), mais plutôt dans un fichier défini par des segments tels que des données, du texte et des bss, pour n'en citer que quelques-uns ; c'est ce qu'on appelle un fichier objet. Le linker intervient et ajuste les segments pour rendre le fichier exécutable, c'est-à-dire prêt à être exécuté. Par ailleurs, la sortie par défaut lorsque vous assemblez avec GNU
as foo.s
est a.out
qui est un raccourci pour Assembler Output. (Mais le même nom de fichier est le nom par défaut de gcc pour le fichier linker la sortie de l'assembleur n'étant que temporaire).
-
Les chargeurs de démarrage ont une directive spéciale définie, à l'époque du DOS, il était courant de trouver une directive telle que .Org 100h
qui définit le code assembleur comme étant de l'ancienne variété .COM avant que .EXE ne devienne populaire. De plus, il n'était pas nécessaire d'avoir un assembleur pour produire un fichier .COM, l'utilisation du vieux debug.exe fourni avec MSDOS faisait l'affaire pour les petits programmes simples, les fichiers .COM n'avaient pas besoin d'un linker et étaient directement prêts à fonctionner au format binaire. Voici une session simple utilisant DEBUG.
1:*a 0100
2:* mov AH,07
3:* int 21
4:* cmp AL,00
5:* jnz 010c
6:* mov AH,07
7:* int 21
8:* mov AH,4C
9:* int 21
10:*
11:*r CX
12:*10
13:*n respond.com
14:*w
15:*q
On obtient ainsi un programme .COM prêt à être exécuté, appelé 'respond.com', qui attend la frappe d'une touche et ne l'affiche pas à l'écran. Remarquez, au début, l'utilisation de 'a 100h' qui montre que le pointeur d'instruction commence à 100h ce qui est la caractéristique d'un .COM. Cet ancien script était principalement utilisé dans des fichiers batch attendant une réponse et ne la répercutant pas. L'original du script se trouve à l'adresse suivante ici .
Encore une fois, dans le cas des chargeurs de démarrage, ils sont convertis en un format binaire, il y avait un programme qui venait avec le DOS, appelé EXE2BIN . C'était le travail de conversion du code objet brut dans un format qui peut être copié sur un disque bootable pour le démarrage. Rappelez-vous qu'aucun éditeur de liens n'est exécuté contre le code assemblé, car l'éditeur de liens est destiné à l'environnement d'exécution et configure le code pour le rendre exécutable.
Le BIOS, lorsqu'il démarre, s'attend à ce que le code soit au segment : offset, 0x7c00, si ma mémoire est correcte, le code (après avoir été EXE2BINé), commencera à s'exécuter, puis le chargeur de démarrage se relocalisera plus bas dans la mémoire et continuera à charger en émettant int 0x13 pour lire depuis le disque, activer la porte A20, activer le DMA, passer en mode protégé car le BIOS est en mode 16bit, puis les données lues depuis le disque sont chargées en mémoire, puis le chargeur de démarrage émet un saut lointain dans le code de données (probablement écrit en C). C'est en substance la façon dont le système démarre.
Ok, le paragraphe précédent semble abstrait et simple, j'ai peut-être oublié quelque chose, mais c'est comme ça en résumé.
2 votes
Le chargeur de démarrage n'est que du code machine sans les en-têtes binaires et autres éléments que le système d'exploitation utilise lorsqu'il charge un binaire en mémoire. L'assembleur, le C et le C++ sont tous compilés (la plupart du temps) en binaires. En d'autres termes, ils peuvent être "emballés" différemment.
0 votes
@lamas, où avez-vous trouvé ça ? Mon livre C : The Complete Reference, 4e édition, par Herbert Schildt, que je viens d'acheter, dit qu'il compile en binaire. La norme ANSI pour C devrait clarifier la question. Malheureusement, je n'en ai pas d'exemplaire.
9 votes
Le livre de @Geoffey Schildt a la réputation d'être le pire livre technique jamais écrit - il est truffé d'erreurs et de contre-vérités.
4 votes
Avant de progresser en tant que développeur, vous devez bien comprendre ces termes : code machine , code binaire , langage assembleur , code exécutable et microcode . De nombreuses personnes les considèrent comme ayant la même signification, mais elles sont différentes, notamment en ce qui concerne la programmation des systèmes embarqués.
0 votes
Merci pour vos réponses concernant les chargeurs de démarrage, mais elles auraient dû servir d'exemple pour ma question uniquement.
0 votes
@Neil vous devriez vraiment étayer ce genre d'affirmation avec un lien.
0 votes
Voir accu.org pour savoir pourquoi le livre de Schildt ne vaut ni votre temps ni votre argent.
0 votes
Notez que sur les PC, le code du chargeur de démarrage est un code machine différent (16 bits) de celui de la plupart des programmes et du noyau (32/64 bits).
1 votes
Notez également que gcc ne compile pas en code machine. Il compile en assembleur. AS traduit ensuite l'assembleur en code machine. Cependant, la plupart des compilateurs produisent directement le code machine.
0 votes
@anon, comment se fait-il que des manuels aussi mauvais se vendent toujours aussi bien ? Je veux dire que les critiques sont plutôt mauvaises, mais que le nombre de ventes de ses manuels est l'un des meilleurs ?
0 votes
Relié, possiblement en double : Un compilateur produit-il toujours un code d'assemblage ?