Mettre de l'assembleur en ligne sous Visual C++

cs_alain34270 Messages postés 85 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 18 septembre 2005 - 21 févr. 2003 à 17:58
cs_alain34270 Messages postés 85 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 18 septembre 2005 - 24 févr. 2003 à 04:31
alain

Bonjour,

Voilà. J'ai un problème avec mon disque dur. je voudrais lire les secteurs physiques de mon disque dur, si possible à partir de visual C++, afin de récupérer des données suite au plantage d'une installation.

Pour cela, je pourrais utiliser l'int 13h du bios, mais je n'ai pas envie d'écrire tout le programme en assembleur. Je pourrais lancer un petit programme à partir du c qui lit le secteur voulu et le met dans un fichier, mais l'exécution serait longue (sans parler des problèmes de synchro).

Quelqu'un pourrait il me dire comment je peux lancer l'int 13h directement à partir du visual C++ (si c'est possible ?) ?

Merci d'avance !

alain

8 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 févr. 2003 à 18:34
Salut,
en VC++ tu fais une func en asm pur sans probleme
exemple, on fait a = a + b * -1:
__declspec(naked) void __stdcall MaFunc(DWORD *a, DWORD b)
{
__asm {
mov eax, [esp+8] ; b
mov ecx, [esp+4]
neg eax
inc eax
add [ecx], eax
ret 8
}
}
bien sur toi tu feras un truc utile, juste pour montrer.
Avec __declspec(naked) devant func le compilo n'y fout pas ses pattes donc tu fais ce que tu veux.
Tout le code doit se trouver dans un bloc __asm {}, ne pas oublier le ret nbr en finale, en somme de l'asm normal. C'est a toi de sauver et restaurer tout registre autre que eax, ecx et edx. Si tu veux retourner une valeur, dans eax comme d'hab.
Fais gaffe que sur noyau NT, system va bloquer ton prog si tu essaies d'acceder au disque en direct. Soit on ecrit un driver ou on se sert de DeviceIoControl.
ciao...
0
cs_GoldenEye Messages postés 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
21 févr. 2003 à 19:14
-------------------------------
Réponse au message : Hello BruNews. Tu as l'air de mastériser l'interfaçage ASM-VC++ et moi je lutte un peu... A quoi sert le "8" après le ret ? Sinon j'ai pigé merci ! Pratik la méthode du complément à 2 pour trouver l'opposé de b :-p
Il est par contre impossible à ma connaissance de lancer une int 16 bit (13h,21h,10h) depuis VC++ qui est 32 bits. Il faut utiliser DJGPP.
-------------------------------

> Salut,
> en VC++ tu fais une func en asm pur sans probleme
> exemple, on fait a = a + b * -1:
> __declspec(naked) void __stdcall MaFunc(DWORD *a, DWORD b)
> {
> __asm {
> mov eax, [esp+8] ; b
> mov ecx, [esp+4]
> neg eax
> inc eax
> add [ecx], eax
> ret 8
> }
> }
> bien sur toi tu feras un truc utile, juste pour montrer.
> Avec __declspec(naked) devant func le compilo n'y fout pas ses pattes donc tu fais ce que tu veux.
> Tout le code doit se trouver dans un bloc __asm {}, ne pas oublier le ret nbr en finale, en somme de l'asm normal. C'est a toi de sauver et restaurer tout registre autre que eax, ecx et edx. Si tu veux retourner une valeur, dans eax comme d'hab.
> Fais gaffe que sur noyau NT, system va bloquer ton prog si tu essaies d'acceder au disque en direct. Soit on ecrit un driver ou on se sert de DeviceIoControl.
> ciao...
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > alain
> >
> > Bonjour,
> >
> > Voilà. J'ai un problème avec mon disque dur. je voudrais lire les secteurs physiques de mon disque dur, si possible à partir de visual C++, afin de récupérer des données suite au plantage d'une installation.
> >
> > Pour cela, je pourrais utiliser l'int 13h du bios, mais je n'ai pas envie d'écrire tout le programme en assembleur. Je pourrais lancer un petit programme à partir du c qui lit le secteur voulu et le met dans un fichier, mais l'exécution serait longue (sans parler des problèmes de synchro).
> >
> > Quelqu'un pourrait il me dire comment je peux lancer l'int 13h directement à partir du visual C++ (si c'est possible ?) ?
> >
> > Merci d'avance !
> >
> > alain
> >
>
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 févr. 2003 à 19:49
le 8 apres ret est le nombre d'octets qui ont ete "pushes" par l'appelant.
Il y avait dans exemple 2 params donc 8 octets.
Donc ret 8 fera:
mov eip, [esp]
add esp, 8
Ce ret est obligatoire cause __declspec(naked) qui interdit toute instruction C du genre return etc...
Le nbr pour ret cause __stdcall, donc a l'appele de remonter ESP.
la prochaine adr instruction est toujours mise en ESP. C'est pour cela qu'on recup le 1er param en [esp+4] etc..
le prog peut continuer car il a recup adr next instruction.
Tu peux mettre int value sans probleme, a toi de coder value correctement.
ciao...
0
cs_alain34270 Messages postés 85 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 18 septembre 2005
22 févr. 2003 à 08:24
alain

merci pour tous ces détails.

le 8 après le ret sert à dépiler 8 octets avant de faire le ret.

alain
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_alain34270 Messages postés 85 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 18 septembre 2005
22 févr. 2003 à 17:40
alain

Salut.

Maintenant, j'arrive sans problème à mettre de l'asm dans un programme C (merci beaucoup).

Mon (autre) problème, c'est que je dois lire des secteurs qui ne font partie d'aucune partition (puisqu'elle n'existe plus :-( ).
Je dois donc utiliser l'int 13h étendu.
Or, le DAP de l'int 13 étendu n'accepte que des adressages 16 bits (à ma connaissance).

Y'aurait pas moyen de créer un petit environnement 16 bits en C ? ou
Y'aurait-il une autre solution simple ?

Merci
ciao
0
cs_alain34270 Messages postés 85 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 18 septembre 2005
22 févr. 2003 à 17:42
alain
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 févr. 2003 à 17:57
si tu as encore un compilo C 16 bits alors oui sinon neni.
Solution envisageable (et meme preconisee pas MS si si), tu fais une dll ou un exe 16 bits avec masm (ou autre) et tu peux le charger depuis ton prog 32 bits. Moi je prefere exe mais c'est selon, exe aura avantage de tourner en processus separe et pas risque de planter prog appelant.
ciao...
0
cs_alain34270 Messages postés 85 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 18 septembre 2005
24 févr. 2003 à 04:31
alain

OK, merci pour tout, bruNews.
Je vais faire un petit prog exe en assembleur pour lire les secteurs...
ciao.
0
Rejoignez-nous