7
votes

Comment compiler un fichier d'assemblage à un format Binary Binary (comme DOS .com) avec assembleur GNU (AS)?

Je veux compiler ce code source sous Windows (il suffit d'un exemple): xxx pré>

Lorsque je le compile avec NASM ou FASM, la longueur du fichier de sortie est de 2 octets. Mais lorsque je le compile avec l'assembleur GNU (AS), la longueur du fichier de sortie est de 292 octets! P>

Comment compiler un fichier d'assemblage à un format binaire brut (comme DOS .com) avec GNU Assembler (AS)? p>


Pourquoi je fais cela? P>

Je veux écrire mon propre système d'exploitation simple, j'écris mes codes avec C (sans utiliser de notes de notes C Même Stdia.h ou mathématiques .h) et le convertir à l'assemblage: p>

as my_os.asm


9 commentaires

Peut-être que vous pouvez commencer par écrire votre propre assembleur :) Je suppose que les octets "290" que vous consultent sont à partir de l'en-tête de fichier: chaque fichier d'objet binaire en a une d'entre elles.


@ Paulsm4: Oui! 290 octets d'en-tête mais je ne veux pas d'en-tête!


@AMIR - Vous ne pouvez pas simplement utiliser objcopy ou segedit ou quelque chose pour copier les parties binaires que vous aimez?


@Cirosanttilli 疆疆 中心 996icu 六四 事件: Devrait-il être fermé comme un duplicata de Comment générer des fichiers binaires simples comme NasM -F bin avec l'assembleur de gaz GNU? ?


@Petercordes Oui, c'est ce que j'ai dit il y a 5 ans sur mon commentaire précédent :-)


@Cirosantilli 疆疆 中心 996icu 六四 事件: Je vous demandais si cela était toujours précis, car vous avez une réponse sur les deux questions que vous avez mises à jour depuis lors.


@Petercordes j'ai besoin d'obtenir une de ces diploises de montage XD


@Cirosantilli 疆疆 中心 996icu 六四 六四: Certaines de vos réponses de mon assemblée semblent être sous un 2ème compte. La fusionner pourrait aider.


@Petercordes C'est bon, j'ai besoin d'une marionnette "politiquement amorale" pour des raisons :-)


3 Réponses :


0
votes

Utilisez le nab avec l'option -f bin pour compiler votre code d'assemblage dans un fichier binaire brut.


5 commentaires

Mais NasM ne peut pas compiler la sortie de montage de GCC (voir gcc -s my_os.c -o my_os.asm -masm = Intel )


D'autre part, GCC ne génère pas de code de 16 bits dont vous avez besoin parce que votre secteur de démarrage commence à exécuter en mode 16 bits. Toutes les manipulations de pointeur / adresse du code C compilée pour le mode 32 bits seront incorrectes en mode 16 bits.


Downvoter, soyez plus constructif.


@alex L'affiche utilise évidemment l'assembleur de gaz, pas NasM. Donc, votre réponse n'est pas vraiment une réponse du tout.


@HAWKEN: IIRC, (g) Comme ne produit des fichiers binaires plats / cris. Voulons-nous une solution impossible?



7
votes

ld -oformat binaire

pour tests rapides et sales que vous pouvez faire: xxx

donne : xxx

malheureusement, cela donne un avertissement: xxx

qui n'a pas beaucoup de sens avec binaire . Il pourrait être réduit de silence avec: xxx

et: xxx

ou simplement avec: xxx

qui indique ld que le point d'entrée n'est pas _start mais le code à l'adresse 0 << p> Il est dommage que ni comme ni ld ne puisse pas entrer / output à partir de stdin / stdout, donc pas de tuyauterie.

approprié Secteur de démarrage

Si vous allez à quelque chose de plus grave, la meilleure méthode consiste à générer un script de liaison minimal propre. linker.ld : xxx

ici, nous placons également les octets magiques avec le script de liaison.

Le script de liaison est important. avant tout pour contrôler les adresses de sortie après la relocalisation. En savoir plus sur la relocalisation à: https://stackoverflow.com/a/30507725/895245

Utilisez-le comme suit: xxx

et ensuite vous pouvez démarrer comme: xxx

exemples de travail sur ce référentiel: https://github.com/cirosantilli/x86-bare-metal-examples / BLOB / D217B180BE4220A0B4A453F31275D38E697A99E0 / MAKEFILE

Testé sur Binutils 2.24, Ubuntu 14.04.


0 commentaires

0
votes
fasm yourcode.asm targetfilename.com

3 commentaires

La question dit déjà "lorsque je le compile avec NASM ou FASM, la longueur du fichier de sortie est de 2 octets". Ce n'est pas une réponse à cette question , qui concerne le gaz.


Je vois, mais je ne comprends pas pourquoi doit-être utiliser un autre compilateur lorsque FASM produira le résultat correct.


C'était déjà Débattre dans les commentaires sous the nasm -f bac réponse (qui est la même réponse que celle-ci). Vraisemblablement, ils veulent utiliser la syntaxe de gaz, pas NasM ou FASM, pour une raison quelconque. Ou il semble que la question ait pu venir de l'impression erronée que vous pouvez utilement utiliser cela avec gcc -s de sortie pour créer un code 16 bits.