Bonjour à tous !

Il n'y a pas longtemps, j'ai eu la malchance de tomber sur une série d'articles de linux magazine (retrouvable ici : http://sos.enix.org ) détaillant la réalisation pratique d'un système d'exploitation, alors que je sortais tout juste d'un passionnant bouquin qui détaillait les concepts théoriques (Modern operating systems par Andrew S. Tannenbaum). J'ai pas pu résister, et maintenant ça y est je passe tout mon temps libre à la mise au point d'un petit OS en C (plus deux-trois lignes d'assembleur de ci de là quand il faut vraiment), pour voir de quoi je suis capable.

J'effectue mon développement sous Windows, avec Notepad++ pour l'édition, Cygwin + un gcc 4.3.0 qui cross-compile en i586-gnu, et Bochs 2.4 pour la partie tests. (Ma machine linux est HS alors je me débrouille avec des substituts =p)

Actuellement, mon OS, fortement inspiré du code de l'article 1 de SOS avec quelques ajouts personnels
- Démarre via GRUB
- Peut débiter des chaînes de caractères sur la console de Bochs
- Peut aussi en débiter à l'écran via la mémoire vidéo mappée par le bios

Pour me refaire la main en C et à fins de débuggage (jamais sans mon printf !), je mets actuellement au point quelques routines ayant pour but de gérer des chaînes allouées statiquement (obligé, j'ai pas encore d'allocateur mémoire ), d'une longueur maximum de 255 caractères + le caractère nul (le short string du pascal, quoi).

J'ai déjà fait
- Une fonction qui calcule la longueur d'une chaîne
- Une fonction qui concatène deux chaînes
- Des fonctions qui convertissent des entiers non signés en une représentation décimale/hexadécimale/binaire
- Une fonction qui convertit un entier signé en sa représentation décimale.

Actuellement, je planche sur une fonction qui convertit les double en chaînes, ainsi qu'une autre qui convertit les float en chaîne et se contente en fait d'appeler la première avec un petit transtypage. (Je garde les deux fonctions séparées des fois qu'un jour ça devienne gênant niveau consommation mémoire, pour une raison que je ne connais pas encore, de convertir des float en double)
L'algorithme que j'ai choisi est le suivant :
- Tronquer le double et convertir l'entier signé obtenu en une première chaîne
- Convertir la partie décimale en une seconde chaîne
- Concaténer les deux en ajoutant un '.' au milieu.

Le problème, c'est que les transtypages, avec les flottants, c'est bien coton.
Exemples typiques de choses qui ne marchent pas (a est un float) :
Le code compile parfaitement (zéro warnings ), mais si l'on exécute une de ces opérations, elle renvoie 0 quelle que soit la valeur de a, et dans la console de Bochs j'ai un message du style
Code : Sélectionner tout - Visualiser dans une fenêtre à part
00034665809i[CPU0 ] math_abort: MSDOS compatibility FPU exception
Les questions que je viens humblement poser en ce temple du savoir sont les deux suivantes :
a/Mais qu'est-ce que c'est que cette pantalonnade ?
b/Qui dois-je frapper ? Moi, GCC, ou Bochs ?
et surtout
c/Dites, je vais quand même pas devoir programmer à la main une fonction troncature avec des divisions euclidiennes et des modulos dégueux, si ?

[Expérience : est-ce que, dans un long post, du gras aux endroits importants aide à la relecture les autres personnes autant que moi ?]