Le C et la commande ASM : RET !

Résolu
Foub12 Messages postés 44 Date d'inscription mardi 9 juillet 2002 Statut Membre Dernière intervention 1 avril 2007 - 24 août 2004 à 03:34
Foub12 Messages postés 44 Date d'inscription mardi 9 juillet 2002 Statut Membre Dernière intervention 1 avril 2007 - 24 août 2004 à 21:11
Bonjour,

j'ai récupéré sur Internet les lignes suivantes, codés en assembleur qui permet de déterminer si le BIOS et les disques durs supportent des tailles supérieures à 8GO :

«
push bx cx dx;
mov ah,41h; //Fonction 41h
mov bx,55AAh; //obligatoire.
int 13h; //interruption disques BIOS
cmp bx,55AAh; //Si retourne 55AAh, BIOS et disque supporte fonctions étendues.
pop dx cx bx;
ret
»

J'ai voulu créé une fonction C, qui renverrait le résultat. Mais je ne sais pas comment récupérer la valeur que renvoie le ret ???

int LBA() {
//Fonction qui permet de tester si le BIOS supporte des
//disques supérieur à 8Go !
int res;

asm {
push bx cx dx;
mov ah, 41h;
mov bx, 55AAh;
int 13h;
cmp bx,55AAh;
pop dx cx bx;
ret
}

return res;

}

Comment récupérer dans ma variable C res, le résultat des lignes assembleur...
Merci de votre aide.

Fabien

11 réponses

cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
24 août 2004 à 20:04
Voila rapidement un exemple qui fonctionne sous Borland Turbo C++ 3.0 (c'est pas optimisé du tout j'ai essayer de conserver ton approche du probleme)

#include <stdio.h>

int LBA(void) {
int Temp;
asm {
  PUSH BX;
  PUSH CX;
  PUSH DX;
  MOV  AH,41h;
  MOV  BX,55AAh;
  INT  13h;
  MOV  Temp,BX;
  POP  DX;
  POP  CX;
  POP  BX;
}
return (Temp == 0x55AA);
}

int main(void) {
if (LBA()) {
printf("Oui");
}else{
printf("Non");
}
return 1;
}


@+

E.B.
3
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
24 août 2004 à 08:25
As tu une connaissance du language assembleur ?
a premiere vue non mais c'est pas grave le principe est que tu doit recuperer ta valeur soit en passant par la memoire soit en passant par les registres (ax,bx etc...)

ajoute ceci :

cmp bx,55AAh;
jne L0;
mov word ptr res,1;
L0:
pop dx;
pop cx;
pop bx;
ret;

ou bien passe par une stack frame...

@+

E.B.
0
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
24 août 2004 à 08:26
Ou bien tout bete tu recupere la valeur de bx et tu teste res dans ton code C

mov res,bx

...

If (res == 0x55AA) {
Return TRUE;

@+

E.B.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 août 2004 à 09:49
Tout ceci est ULTRA OBSOLETE, A BANNIR !!!

ciao...
BruNews, Admin CS, MVP Visual C++
0

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

Posez votre question
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 août 2004 à 11:38
Ptit ajout au commentaire de Brunews> INTERRUPTION = BANNI des systemes actuels!

Shell
0
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
24 août 2004 à 12:11
a premier vue il programme de l'asm inline pour un programme C DOS 16 bits donc peut importe si c obselete

Z'etes en forme aujourd'huis ;)

@+

E.B.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 août 2004 à 12:24
Ah ben oui EB, si la base est obsolete alors en avant...

ciao...
BruNews, Admin CS, MVP Visual C++
0
Foub12 Messages postés 44 Date d'inscription mardi 9 juillet 2002 Statut Membre Dernière intervention 1 avril 2007
24 août 2004 à 15:21
re,

pour commencer, je voulais vous remercier de m'avoir répondu...
Alors, oui je programme avec un compiltateur DOS 16 bits donc je peux utiliser les interruptions du BIOS...

Et non, je ne sais pas programmer en ASM même si je suis BAC+4 en info et que je rentre en DESS...

EbArtSoft, ton code à l'air pas mal :
«
cmp bx,55AAh;
jne L0;
mov word ptr res,1;
L0:
pop dx;
pop cx;
pop bx;
ret;
»
mais il ne compile pas... TC++ ne reconnait pas les étiquettes...
Je sais pas comment on fait pour que le compilateur les comprenne ???

Quand à la ligne : « mov res, bx », j'ai essayé de la casé un peu partout (après le ret, avant le ret, après le cmp bc, 55AAh) mais sans réussite.... Où dois-je l'écrire ???

Merci pour votre aide.
Fabien
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 août 2004 à 20:26
Remplit direct AX et vire 'Temp' qui ne sert a rien.

PUSH CX;
PUSH DX;
C'est vraiment utile ?

ciao...
BruNews, Admin CS, MVP Visual C++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 août 2004 à 20:45
Regarde si la syntaxe va bon avec ton compilo:

int LBA(void) {
asm {
PUSH BX;
MOV AH, 41h;
MOV BX, 55AAh;
INT 13h;
MOV DX, BX;
XOR AX, AX
POP BX;
CMP DX, 55AAh;
JNE SHORT lbaExit;
INC AX
lbaExit:
}
}

ciao...
BruNews, Admin CS, MVP Visual C++
0
Foub12 Messages postés 44 Date d'inscription mardi 9 juillet 2002 Statut Membre Dernière intervention 1 avril 2007
24 août 2004 à 21:11
Le dernier code de EBArtSoft fonctionne parfaitement avec mon Turbo C++ !!!!
Merci pour votre aide.

Fabien
0
Rejoignez-nous