Correction d'un code

Signaler
Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011
-
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
-
bonjour,j'ai écrit un code assembleur qui permet de comparer deux tableaux,ce code je veux l'inserer dans un code c.
si vous pouvez bien me le corriger et j'ai une question à poser: je veux en cas d'egalité ecrire un truc que je pourrais utiliser aprés dans le code c qui affirme qu'il y a egalité pour faire qqes traitements
voici le code:
mov bx, 0;


outer_loop:
                 Mov cx,taille;

inner_loop:
                 mov ax, [Aux+bx];
                Cmp ax, [itemset+bx];
                je Element_is_Equal;


Element_is_Equal:
                                    Add bx, 2;
                                    cmp bx,taille;
                                    jne inner_loop;

43 réponses

Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Voilà, retour du résultat (0 si idem, 1 si différent) dans AX :
xor bx, bx
Mov cx,taille;
inner_loop:
mov ax, [Aux+bx];
Cmp ax, [itemset+bx];
Jne isdifferent
Add bx, 2;
cmp bx,taille;
jne inner_loop;
xor ax, ax
ret
isdifferent:
mov ax, 1
ret


VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011

merci infiniment pour la reponse!!
Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011

svp une autre question,en mettant ce code assembleur dans mon code c en utilisant asm("instr"); j'ai aussi mis le tout dans un if (asm("");)==0 pour utiliser l'egalité
et bein ça marche pas et c'est prévisible vu que c'est illogique mais le probleme c'est que code blocks n'accepte pas la forme _asm{intsr} ou __asm{instr}
alors comment je pourrais utiliser mon resultat final??
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Faut assembler avec NASM et linker avec l'objet produit (obj Win32)

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,


Et ne pas mélanger du code certainement 32 bits (C) avec du code 16 bits (assembleur)

@++
Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011

merci,
j'ai compiler mon code assembleur mais j'ai eu une erreur que je n'ai pas su resoudre
"too many memory reference for "cmp"" et ligne erreur est
asm("mov ax,[Aux+si]");
asm("Cmp ax,[itemset+bx]");
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Et ne pas mélanger du code certainement 32 bits (C) avec du code 16 bits (assembleur)


VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011

re,
asm("mov eax,[Aux+esi]");
asm("Cmp eax,[itemset+ebx]");
ça marche pas aussi
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Ajouter un E devant le nom de registres 32 bits ne changera rien : gcc attend une syntaxe AT&T. C'est pas pour rien que j'ai dit d'
assembler avec NASM et de linker avec l'objet produit (obj Win32)


VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011

re,
j'ai utiliser asm (".intel_syntax noprefix"); donc normalment ça marche le syntaxe intel
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Tu vois bien que c'est pas le cas ...

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
et ce n'est pas "Cmp" le nom de l'instruction mais "cmp"
Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011

re,
d'accord merci,svp vous n'aurez pas un lien pour apprendre à linker un fichier asm avec le programme c?
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Faut surtout l'assembler : Code::Blocks gère lui-même le link des fichiers objet. Va dans Settings, Compiler and debugger, Advanced settings, (Clique sur Yes lorsqu'il te demande confirmation), +, tape asm, OK, remplace le texte par nasm -f win32 -o $object $file et quitte les fenêtres de settings en cliquant sur OK. Redémarre Code::Blocks pour que les changements soient pris en compte, ajoute un fichier ASM à ton projet et colles-y ceci :
SEGMENT .code

GLOBAL _taFonction
taFonction:
xor ax, ax
ret

Dans ton header, mets le prototype de la fonction : extern int taFonction(); Tu n'as plus qu'à sauver les fichiers et aller dans le menu Build, puis Build and run (ou taper sur F9).

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011

merci pour l'aide!! j'ai lu dans un doc sur internet qu'il faut mettre dans le fichier asm

_TEXT           SEGMENT byte public 'CODE'

                ASSUME  cs:_TEXT

                PUBLIC  _mafonction
_mafonction      PROC    near            ; appel avec CALL proche

ceci n'est pas correcte??
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Essaie, ça t'explosera à la figure. J'ai pas mis un bout de code pour faire joli ! Evidemment, tu dois avoir au préalable installé NASM et mis son dossier d'installation dans le %PATH%. Tu peux aussi simplement copier nasm.exe que tu auras téléchargé sur Sourceforge

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011

re,
j'ai bien employé votre methode mais là j'ai un probleme avec la declaration de ma fonction dans le code c
voila ce que j'ai mis:
extern int compar(int taille,int a,int aux[],int t[]); au début
et dans le code:
if (compar(taille,a,aux[],t[])==0)
il m'affiche les erreurs suivantes : syntaxe error before ] token
et pour le } qui ferme la fonction main syntaxe error before } token
et en mettant extern int compar(int taille,int a,int &aux,int &t);
et dans le code c la meme chose j'ai comme erreur : syntaxe error before & token
t et aux sont deux tab déclarés dans le prog c et remplie déja
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
A l'instanciation : if (compar(taille,a,aux,t)==0)

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
122
Date d'inscription
vendredi 8 octobre 2010
Statut
Membre
Dernière intervention
16 novembre 2011

re,
si je met cela j'ai undefined reference to _compar
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Dans le fichier ASM, ta fonction doit se nommer _compar et pas compar. Si tu vais pas exactement ce que je dis faut pas s'étonner que ça marche pas.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question