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

Signaler
Messages postés
85
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
18 septembre 2005
-
Messages postés
85
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
18 septembre 2005
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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...
Messages postés
527
Date d'inscription
vendredi 14 septembre 2001
Statut
Membre
Dernière intervention
6 octobre 2008
3
-------------------------------
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
> >
>
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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...
Messages postés
85
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
18 septembre 2005

alain

merci pour tous ces détails.

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

alain
Messages postés
85
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
18 septembre 2005

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
Messages postés
85
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
18 septembre 2005

alain
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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...
Messages postés
85
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
18 septembre 2005

alain

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