[OK] Tableau C dans un code ASM

Tout sur les langages de programmation.

[OK] Tableau C dans un code ASM

Messagepar nichrome » 25 Avril 2005, 15:44

Salut tout le monde !!
C'est mon premier post et j'aimerai soumettre mon problème aux as de la programmation.
Je souhaite lire des secteurs du disque dur à partir du BIOS dans un programme en C. J'ai vu qu'il existait une fonction pour le faire (bios_disk) cependant je ne trouve nulle par sa syntaxe !!
Je me suis donc rabattu sur un petit code ASM inclus dans mon code C en utilisant l'int 13 (vous inquiétez pas c'est un programme pour DOS) du style :

Code: Tout sélectionner
#include ...  // les bibliothéques C

void main()
{
    char secteur[512];

    asm(".......\n\t"
           "int $13");
    return;
}


Cependant les secteurs lus seront transférés à ES:BX. Ma question est donc : comment passer l'adresse de mon tableau secteur dans ES:BX, de manière à récupérer le secteur lu dans mon tableau ?

Merci à tous ceux qui pourront m'aider
Dernière édition par nichrome le 26 Avril 2005, 09:24, édité 1 fois.
nichrome
 
Messages: 0
Inscription: 28 Juillet 2005, 14:12

Messagepar Neitsa » 25 Avril 2005, 15:51

Hello,

deux possibilités :

Code: Tout sélectionner
LEA bx, secteur


ou encore

Code: Tout sélectionner
MOV bx, offset secteur


le résultat est exactement le même.

ensuite pour récupérer un donné du tableau :

Code: Tout sélectionner
mov al, [bx] ; 1ere donnée (sous entendu mov ax, [bx+0]
mov al, [bx+1] ; pour la deuxième etc...


La donnée est placée dans al bien sur et si les données font bien 1 octet (j'ai bien vu que c'était un tableau de char, mais les données font p-e plus d'1 octet). il faudra peut être préciser le type:

Si ca fait plus d'un octet, utilise ax (2 octets)
Code: Tout sélectionner
mov al, byte ptr [bx]
....
mov ax, word ptr [bx]


Enfin, on peut passer par un autre registre qui sert d'index :

Code: Tout sélectionner
lea bx,secteur
xor cx,cx
mov ax,[bx+cx] ; cx remplace un chiffre (ici 0)


ensuite tu peux jouer sur cx pour aller à l'adresse du tableau désirée. J'éspère que cela répond à la question. :D
Neitsa
 

Messagepar nichrome » 25 Avril 2005, 19:16

Merci de t'intéresser à mon problème !

Seulement si je fais juste un mov bx, offset secteur est-ce que ca suffit à passer l'adresse ?? Parce que que viens faire le ES ici sinon ?? A quoi sert-il ? C'est le segment non ? Donc l'adresse que je pointerai avec ES:BX serai ES*16+BX non ?? Peut-tu m'éclairer ?
nichrome
 
Messages: 0
Inscription: 28 Juillet 2005, 14:12

Messagepar Neitsa » 25 Avril 2005, 20:52

Hello,

Oui ES (Extra segment) est bien un segment.

A vrai dire je n'ai quasiment jamais programmé pour de la mémoire segmenté, seulement pour windows qui est en mémoire plate... (ce qui facilite les choses de ce coté là).

Le mieux serait de tester... sinon tu as toujours la possibilité de faire du segment override (proposer les segments plutôt que ce soit le compilateur qui décide).

mov al, es:[bx]


Donc l'adresse que je pointerai avec ES:BX serai ES*16+BX


Je ne comprend pas très bien ton calcul avec le segment. A partir du moment ou BX contient l'adresse d'offset du tableau "secteur" il ne devrait pas y avoir de problème de segmentation (du moins c'est ce que je pense).

Code: Tout sélectionner
mov bx, offset es:[secteur]


Avec ça le compilo devrait être apte à aller chercher le tableau secteur dans le segment ES.

Mes capacités sur le mode non protégé s'arrêtent ici...Le mieux que tu puisse faire ensuite c'est d'essayer et de voir si ca compile correctement.

Peut être qu'un des dinosaures ;) du 16 bits sur le forum poura te venir en aide si jamais cela s'avérait inexact.
Neitsa
 

Messagepar Invité » 25 Avril 2005, 23:31

Il y a un petit problème avec un "mov bx,offset secteur":
Le tableau secteur est une variable locale, son adresse n'est donc pas toujours la même, un "lea bx,secteur" est probablement plus judicieux (ensuite, ça dépend comment l'assembleur de ton compilo C gère ça).
Et puis aussi, en y réfléchissant, la valeur à passer dans ES est probablement celle de SS: les variables locales sont en général passée sur la pile, l'adresse de ton tableau donnerai un truc comme SS:secteur. Enfin, je dis ça, mais ça dépends sûrement de la façon dont ton compilo compile... j'ai jamais essayé de voir du code généré par un compilo C 16 bit mais je suppose que c'est comme les autres: les variables locales sont placées sur la pile.
Le plus simple, ça serait, je pense de déclarer le tableau comme une variable globale, reste toujours le problème du segment qui en toute logique serait DS...
Enfin... pour conclure, c'est vraiment pas b tout ces détails de bas niveau dans du code C, alors, j'ai trouvé ça: http://www.digitalmars.com/rtl/bios.html je sais pas si c'est ce que tu cherchais, si ce n'est pas le cas essaye de chercher dans le fichier d'en tete où est définie la fonction. Bonne chance ;)
Invité
 

Messagepar nichrome » 26 Avril 2005, 09:23

AAAaaah merci beaucoup Invité !!!! C'est exactement ce que je n'ai pas réussi à trouver !!! Et Neitsa je te remercie aussi ! Je n'ai pas essayé ta méthode mais elle marche surement !! Comme je ne suis pas un spécialiste de l'assembleur je vais plutot me contenter de la fonction biodisk()

Encore merci à vous deux :D
nichrome
 
Messages: 0
Inscription: 28 Juillet 2005, 14:12

Epilogue

Messagepar nichrome » 01 Mai 2005, 18:14

Alors la fin de l'histoire : finalement je me suis apercu que Dev-C++ ne permettait pas de faire de programme pour DOS (j'avais déjà lu ca sur des forums, mais je me disai : puisqu'il y a la fenetre DOS, ca doit marcher quand meme......enfin bon :( ).

Il faut donc utiliser TurboC, ou mieux OpenWatcom ! (à noter qu'il faut avec OpenWatcom utiliser la fonction _bios_disk(unsigned service, struct diskinfo_t *info); )

De plus la bibliothèque bios.h n'existe pas sous Dev-C++, vu qu'elle utilise des interruptions bios incompatibles avec Win32.

(voila c'est au cas ou ca intéresse quelqu'un.........mais c'est pas sur 8) )
nichrome
 
Messages: 0
Inscription: 28 Juillet 2005, 14:12


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités