2015-04-11 1 views
0

J'ai écrit un chargeur de démarrage dans MSNA qui charge une donnée de programme 64kb du disque dans la mémoire commence par l'adresse 0060: 0000 [SEG: OFF]. J'ai testé cette partie de mon projet en écrivant du code dans Assembly (NASM) et en le mettant dans le disque. Fonctionne bien!Comment puis-je générer RAW BIN avec offset segment déclaré en utilisant WatCom

Le projet complet est un peu complexe pour l'écriture totale dans Assembly. Donc, je décide que je vais utiliser C avec l'Assemblée inline pour plus loin. Pour cela, je télécharge un environnement nommé open-watcom-c-win32-1.9. J'ai un simple code C pour tester certaines directives du compilateur et de l'éditeur de liens WatCom pour créer un fichier RAW BIN. Le fichier bin est généré mais ne s'exécute pas après que mon chargeur de démarrage l'a chargé dans la mémoire. J'essaie beaucoup de directives wlink pour définir les valeurs de segment et de décalage mais ne fonctionne pas.

void main() 
{ 
__asm 
     { 
     mov ah, 0x0E 
     mov al, '!' 
     int 0x10 
     } 
} 

Je pense que le problème est que le compilateur et l'éditeur de liens utilisent des adresses de segment et de décalage incorrectes pendant la génération du code. Parce que le Wlink supprime l'erreur suivante dans tous les cas.

Avertissement! W1023 pas d'adresse de départ trouvé, en utilisant 0000: 0000

Je ne sais pas comment je peux définir correctement les adresses de décalage de segment, mais il serait necceserly pour un programme de travail. Mes questions que ce genre de directives WatCom que j'utilise pour générer 16 bits en mode réel fichier RAW BIN à partir d'un code source C avec segment déclaré: offset? C'est possible avec WatCom ou dois-je utiliser d'autres choses?

Répondre

0

Comme l'ordre des fonctions C est quelque peu imprévisible, un code de démarrage spécial est nécessaire au point d'entrée réel. Dans ce cas, le point d'entrée est toujours au tout début du fichier. Le décalage codé de ce code initial dicte également le décalage de toutes les autres adresses (le segemnt n'a pas d'importance et le compilateur ne fait aucune hypothèse à ce sujet). Vous voudrez probablement écrire votre propre code init très léger. Le code init par défaut est dans le fichier cstart_t.obj, vous devez donc le remplacer. Exactement ce que vous devez y mettre dépend de ce dont vous avez besoin, si l'éditeur de liens se plaint d'un symbole manquant, vous devrez peut-être l'y jeter. Un minimum comme ceci fonctionnera avec votre code d'exemple mais pourrait laisser certaines fonctions C inutilisables (écrites en syntaxe Nasm):

global __STK 
extern main_ ; The actual name of the main function depends on the memory model I think. 

section _INIT class=CODE 

resb 0  ; The expected offset of the code. 
..start: 
    jmp main_ ; Don't expect main() to return. 

section _STACK stack class=STACK 
__STK: 

group DGROUP _INIT _STACK