2012-12-08 1 views
0

J'utilise Turbo C++ 3.1.Turbo C++: Générer du code objet pour la fonction malloc

J'ai quelques modules d'assemblage qui nécessitent le malloc de la bibliothèque standard C. Je dans mes fichiers .asm J'ai:

extern _malloc:proc 

Je veux générer un fichier objet qui contient malloc(). Pour utiliser l'éditeur de liens et créer un fichier exécutable. Exemple:

tasm /zi bmlib.asm // create object file: bmlib.obj 
tasm /zi bmlibt.asm // create object (which contains main program): bmlibt.obj 
? //Generate object file for malloc: malloc.obj 
tlink /v3 bmlibt bmlib malloc // link all modules 
bmlibt.exe // Execute the program 
+1

Si vous voulez utiliser le 'malloc()' de l'exécution, vous devrez lier dans la bibliothèque d'exécution (puisque 'malloc()' a certainement son propre ensemble de dépendances). Vous devrez également vous assurer que l'exécution est initialisée correctement. Vous trouverez peut-être plus facile de lier vos fichiers d'assemblage à un petit programme C qui ne fait rien d'autre qu'un point d'entrée pour votre programme en langage assembleur. Ou peut-être implémenter un simple 'malloc()' –

+0

Merci. La pointe du fichier C est géniale. Pour implémenter mon propre malloc, je devrais utiliser des interruptions pour demander de l'espace à l'OS, n'est-ce pas? – blaze

+0

C'est probablement une façon de le faire. J'imagine qu'il existe un moyen d'obtenir l'éditeur de liens pour configurer les en-têtes .exe afin qu'il y ait un pool de mémoire lorsque le processus est chargé, mais cela fait longtemps que je n'ai pas travaillé avec MS-DOS. des détails sur comment cela pourrait fonctionner. –

Répondre

2

Si vous voulez vraiment le malloc de Turbo C++ dans un fichier objet, vous utiliserez tlib pour extraire ce fichier objet de la bibliothèque standard. Offhand je ne me souviens pas du drapeau à donner à tlib avec n'importe quelle certitude, ni le nom du dossier pour la bibliothèque standard, mais les deux devraient être assez faciles à trouver.

Vous n'avez pas vraiment besoin de faire cela: si vous utilisez simplement tcc sur la ligne de commande, il compilera et reliera automatiquement les modules que vous avez utilisés depuis la bibliothèque standard. Cependant, vous devez utiliser au moins un fichier en C - malloc dépend de l'initialisation qui se produit dans le code de démarrage C, donc même si vous le liez avec succès, sans ce code de démarrage, cela ne fonctionnera pas.

+0

Ouais, je vais utiliser le conseil de fichier C. Mais, je veux toujours apprendre à faire tout cela sans avoir besoin de fichiers C, va essayer le conseil de tlib plus tard. – blaze

+0

@metroxylon: Si vous voulez une bibliothèque standard que vous pouvez utiliser en assemblage pur, vous pouvez envisager l'option [Assemblage spontané] (http://kevincrenshaw.com/spontaneous.htm). Je l'ai utilisé quand il était neuf - c'est * plutôt * bon. –

+0

Cool, merci pour le lien. – blaze

1

malloc() fait partie de la bibliothèque d'exécution C (ou C++). Vous pourriez être en mesure d'indiquer à votre éditeur de liens de lier statiquement le runtime C (souvent appelé CRT), mais normalement il est lié dynamiquement pour que la taille de votre exécutable soit plus petite. Dans tous les cas, vous n'avez généralement pas l'option d'intégrer l'implémentation malloc() de l'environnement d'exécution dans un fichier objet distinct. Si vous implémentez votre propre version, bien sûr, cela fera partie de votre fichier objet. Dans ce cas, votre implémentation remplace l'implémentation du système.

Donc je suppose que ce que vous devriez chercher est de dire à l'éditeur de liens que vous voulez lier avec la bibliothèque d'exécution C, que ce soit statiquement ou dynamiquement. Ensuite, votre fichier d'objet d'assemblage doit y avoir accès lorsqu'il est lié à un exécutable final.