Bonjour,
Je viens de faire un petit programme en C qui crée un fichier COM pour MS-DOS / peut qu'il marche sur d'autre système DOS (testé sous MS-DOS 6.22).
En premier lieu j'ai créé un programme COM minimal en assembleur qui s'ouvre et se ferme directement sous DOS sans rien faire d'autre.
En visionnant le code hexadecimal de ce programme ça se résume à ceci:
J'ai voullu pour étude créer un logiciel en C capable de générer ce même programme en se lancant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part B8 00 4C CD 21
J'ai réussi au final a avoir un code similaire généré par mon programme C, cependant il y a 2 '0' en plus à la fin du fichier COM c.a.d ceci:
A savoir j'utilise la fonction C fwrite() pour générer du code dans mon fichier en mode binaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part B8 00 4C CD 21 00
Voici le code source du programme en C capable de générer le fichier COM éxecutable.
Dans l'exemple ici j'ai du faire quelques calcule pour tomber sur les chiffres en mode décimal pour correspondre aux chiffres hexadécimaux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <stdio.h> int main(void){ int a=0; FILE *fp; char str[8]; fp=fopen("file.com","wb"); if (fp==NULL) return -1; a=184; /*org 100*/ fwrite (&a,sizeof(a),1,fp); a=52556; fwrite (&a,sizeof(a),1,fp); a=33; fwrite (&a,sizeof(a),1,fp); fclose(fp); return 0; }
Ce concernant je n'ai pas vraiment tout compris car j'ai du inverser les lettre 4C CD en C4 DC pour effectuer mon calcul final
C*16^0 + 4*16^1 + D*16^2 + C*16^3 = 4CCD (C'est ce que je n'ai pas compris car c'est inversé par paire)
12+64+3328+49152=52556
21h = 33
Si vous pouvez m'explique la raison pour laquelle j'ai du inverser les lettres pour le calcul de 4CCD?
Aussi pourquoi fwrite() place 00 à la fin de mon fichier COM? Est-ce impossible d'omettre ce '00'?
Cependant le fichier COM final s'execute correctement.
Partager