Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1742 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Auteur Sujet :

INTEL GNU bug dans un programme... multiplication, comparaison

n°329353
chrisbk
-
Posté le 11-03-2003 à 11:26:26  profilanswer
 

Reprise du message précédent :
que t'essaye de lire/ecrire la ou t'as pas droit

mood
Publicité
Posté le 11-03-2003 à 11:26:26  profilanswer
 

n°329357
theorie du​ chaos
morte et enterrée
Posté le 11-03-2003 à 11:30:02  profilanswer
 

ok merci :)

n°330234
theorie du​ chaos
morte et enterrée
Posté le 12-03-2003 à 10:15:56  profilanswer
 

bon... comme je savais que je vous manquais... :evil:
j ai une question...
 
j ai en haut de ma pile l adresse d une valeur a convertir...
 
la convertion se passe separement au niveau de chaque octet
il me faut donc un moyen de designer ces octets...
 
comme on m impose de passer l adresse de la valeur dans la pile et non la valeur... je crois que c pas dans l esprit de copier betement la valeur :/
 
si vous avez une idee

n°330242
chrisbk
-
Posté le 12-03-2003 à 10:28:38  profilanswer
 

Theorie du chaos a écrit :

bon... comme je savais que je vous manquais... :evil:
j ai une question...
 
j ai en haut de ma pile l adresse d une valeur a convertir...
 
la convertion se passe separement au niveau de chaque octet
il me faut donc un moyen de designer ces octets...
 
comme on m impose de passer l adresse de la valeur dans la pile et non la valeur... je crois que c pas dans l esprit de copier betement la valeur :/
 
si vous avez une idee


 
ben tu pop ta pile dans un registre, et tu passe par ce registre:
 
genre :
 
pop eax;
movl (eax),ebx
faire calcul en utilisant ebx ( qui contient la valeur pointee par l'adresse qui fut precedemment au sommet de la pile (ouf))
 
 
 
 
 
 
 

n°332235
theorie du​ chaos
morte et enterrée
Posté le 13-03-2003 à 16:26:48  profilanswer
 

attention je v tester la version 2 :D

n°332239
theorie du​ chaos
morte et enterrée
Posté le 13-03-2003 à 16:30:28  profilanswer
 

Program received signal SIGSEGV, Segmentation fault.
0x4007d9dc in _IO_vfprintf (s=0x4015a180,  
    format=0x8048621 "Valeur de l entier correspondant a la chaine %s : %d\n",  
    ap=0xbffff974) at ../sysdeps/i386/i486/bits/string.h:530
530     ../sysdeps/i386/i486/bits/string.h: No such file or directory.
        in ../sysdeps/i386/i486/bits/string.h
 
 
ca veut dire quoi :'(

n°332282
bjone
Insert booze to continue
Posté le 13-03-2003 à 17:16:12  profilanswer
 

je sais pas ce que tu veux faire, mais un "printf" je ferais comme ça:
 
printf("bijour %d %d...",arg1,arg2);
 
push arg2
push arg1
push offset bijour_str
call printf

n°332295
theorie du​ chaos
morte et enterrée
Posté le 13-03-2003 à 17:25:50  profilanswer
 

mes printf precedents marchent...
je comprends pas le probleme avec celui la :(

n°332485
theorie du​ chaos
morte et enterrée
Posté le 13-03-2003 à 20:25:20  profilanswer
 

bon deja... y a le scanf du programme principal qui chie... :/
quand je lui donne une chaine genre 0x32353634
je n obtient meme pas ca dans ma variable chainecar...
si qq un est inspire...
peut etre que mon decalage par rapport a ebp n est pas bon dans carbin... je sais pu :sweat:
 
 
******************************************************************/*TP1 conversion caractere - binaire - caractere*/
 
 
/*Version minimale du programme:  
Les entiers sont non signes,  
on ne verifie pas le nombre de chiffres de la chaine,  
il doit etre inferieur a 4 octets*/
 
 
 
/*programme de conversion caractere - binaire*/
 
/*Cette procedure recoit l adresse d une chaine de caracteres et la convertit en nombre entier. Les  
entiers sont non signes, on ne verifie pas le nombre de chiffres de la chaine. Le passage des parametres  
sera opere de la facon suivante: adresse de la chaine a convertir dans la pile et resultat dans le registre EAX.*/
 
 
 .equ  Dcha,   8   # Deplacement de l adresse de chainecar dans la pile  
 
 .text
 .global carbin
 
carbin:  
 pushl  %ebp
 movl  %esp,   %ebp
 xorl  %eax,   %eax  # Mise a zero de EAX
 movl  Dcha(%ebp), %ebx  # Dcha(%ebp) = adresse chainecar
 movl $10,  %ecx
 
itercarbin:
 cmpb  $0x30,   (%ebx)    
 jl  fincarbin
 cmpb  $0x39,   (%ebx)
 jg  fincarbin
 subb  $0x30,   (%ebx)   # code caractere
 mull  %ecx    # EAX = 10 * EAXprecedent
 addl  (%ebx),  %eax
 addl $1,  %ebx  # EBX = EBX + 1
 jmp  itercarbin   # On boucle  
 
fincarbin:
 leave
 ret
 
 
 
/*programme de conversion binaire - caractere*/
 
 
/*La valeur de l entier et l adresse de la chaine resultat sont passes dans la pile*/
 
 
 .equ  diviseur, 10
 
 .text
 .global bincar
 
 .set  d, 0
 .set  n,  8   # Deplacement de n dans la pile
 
bincar:  
 pushl  %ebp
 movl  %esp,   %ebp
 movl  n(%ebp), %ebx  # EBX = adresse de chainecar
 .set  n,   n*2  # Deplacement de 2n dans la pile
 movl  n(%ebp), %eax  # EAX = valeur de l entier
 
iterbincar:
 movl $10,  %ecx # ECX = 10
 xorl  %edx,   %edx
 divl  %ecx    # EAX = EAX/10, EDX = reste
 addb  $0x30,   %dl  
 movb  %dl,  d(%ebx) # chaine resultat copiee a l adresse chainecar
 .set d,  d+1 # d = d+1
 cmpl  $0,   %eax
 jne  iterbincar   # On boucle tant que l entier est different de 0
 
 
finbincar:
 leave
 ret
 
 
 
 
/*programme principal*/
 
 
 .section .rodata
Auteurs:  .string "Ce programme vous est propose par \nMathieu Chondroyannis et Nadege Griesser\n"
Question: .string "Chaine de caracteres:"
Chaine:  .string "%s"
Entier:  .string "%d"
Resultat1:  .string "Valeur de l entier correspondant a la chaine %s : %d\n"
Resultat2: .string "Chaine de caracteres correspondant a l entier %d : %s\n"
 
 .data
chainecar:  .int 0   # Double mot, chaine de caracteres
 
 .text
 .global main
 
main:  
 pushl  %ebp
 movl  %esp,  %ebp
 
presentation:
 pushl  $Auteurs
 call printf
 addl  $4,   %esp  # Desempilement de Auteurs
 pushl  $Question
 call  printf
 addl  $4,   %esp  # Desempilement de Question
 
car:  
 pushl  $chainecar  # Empile l adresse de chainecar
 pushl  $Chaine   # Empile l adresse de Chaine
 call  scanf
resu: addl  $2*4,  %esp  # Desempilement des parametres de scanf
 pushl  $chainecar  # Empile adresse de la chaine de caracteres
 call  carbin   # Resultat dans EAX
 addl  $4,   %esp  # Desempilement du parametre de carbin
 pushl  %eax   # Empile la valeur de l entier
 pushl  chainecar  # Empile la chaine de caracteres  
 pushl  $Resultat1
 call  printf
 addl  $3*4,   %esp  # Desempilement des parametres de printf
 
 
bin:  
 pushl  %eax   # Empile la valeur de l entier
 pushl  $chainecar  # Empile l adresse de la chaine resultat
 call  bincar   # Chaine de caracteres a l adresse chainecar
 addl  $4,   %esp  # Desempilement de l adresse
 popl  %eax    # EAX = valeur de l entier
 pushl  chainecar   # Empile la chaine resultat
 pushl  %eax   # Empile la valeur de l entier
 pushl  $Resultat2
 call  printf
 addl  $3*4,  %esp  # Desempilement des parametres de printf
 
fin:  
 leave
 ret

n°333357
bjone
Insert booze to continue
Posté le 14-03-2003 à 13:33:22  profilanswer
 

fait gaffe à tes %s, le xprintf attends un pointeur sur chaine dans la pile.

mood
Publicité
Posté le 14-03-2003 à 13:33:22  profilanswer
 

n°333373
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 13:46:02  profilanswer
 

quand je fais mon scanf et que je regarde ce que j obtient dans chainecar... c est pas ce que j ai rentre...
 
vous voyez pourquoi?

n°333379
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 13:47:33  profilanswer
 

pour le printf j ai pas de problemes pour Auteurs et Question...
 
pour apres je sais pas :d

n°333488
bjone
Insert booze to continue
Posté le 14-03-2003 à 14:45:45  profilanswer
 

ton scanf tu veux qu'il te chopes quoi ?
un entier ou une chaine ?
 
si c'est un entier, fo que:
 
Chaine soit "%d" et pas "%s".
 
sinon le scanf te mets la chaine saisie dans ChaineCar qui est un DWORD.

n°333617
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 15:53:26  profilanswer
 

je veux convertir une chaine de caractere en decimal...
pour ca je saisi la chaine au scanf...
le prof nous a dit de prendre un %s
mais je commence a me poser des questions :/
 
c est quoi un dword exactement?

n°333619
chrisbk
-
Posté le 14-03-2003 à 15:58:27  profilanswer
 

Theorie du chaos a écrit :

je veux convertir une chaine de caractere en decimal...
pour ca je saisi la chaine au scanf...
le prof nous a dit de prendre un %s
mais je commence a me poser des questions :/
 
c est quoi un dword exactement?


 
byte = 8bits
word = 16bits
double word (aka dword) = 32bits
quad word = 64bits

n°333672
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 17:21:44  profilanswer
 

ma variable chainecar est faite pour un double mot [:proy]

n°333688
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 17:42:31  profilanswer
 

bon...
j ai mon scanf...
je lui tape 2
il sauve 0x2
je lui tape 0x32
il sauve 0x32
je tape 0x32353436
il sauve 0x32337800

n°333689
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 17:43:14  profilanswer
 

est ce que j ai une erreur dans mon adresse?

n°333750
bjone
Insert booze to continue
Posté le 14-03-2003 à 18:52:23  profilanswer
 

nein  [:ripeer]  
 
bon voilà le pb:
 
tu dois faire la conversion oki ?
 
tu dois faire une routine en asm de ce style:
 
char chainesaisie[128];
int valeur;
 
scanf("%s",chainesaisie);
 
valeur=routinedeconversion(chainesaisie);
 
printf("%d",valeur);
 
donc:
tu chopes la chaines ASCII dans un tampon
tu la moulines pour qu'elle soit convertie en valeur entière (int)
puis tu l'affiches avec printf
 
HORS:
 
ton appel de scanf utilise comme chaine de formattage "%s", scanf attends donc un tampon de grande longeur et pas un entier (DWORD).
 
tu gardes le "%s", mais 'chainecar' DOIT être une zone mémoire de pleins d'octets, et non pas un DWORD (de 4 octets) car quand ta chaine dépasse 4 octets, tu crames ta zone de donnée ou tu fais une violation d'espace mémoire.
 
comprendo ?

n°333752
bjone
Insert booze to continue
Posté le 14-03-2003 à 18:55:34  profilanswer
 

Citation :


*programme principal*/
 
 
.section .rodata
Auteurs:  .string "Ce programme vous est propose par \nMathieu Chondroyannis et Nadege Griesser\n"
Question: .string "Chaine de caracteres:"
Chaine:  .string "%s"
Entier:  .string "%d"
Resultat1:  .string "Valeur de l entier correspondant a la chaine %s : %d\n"
Resultat2: .string "Chaine de caracteres correspondant a l entier %d : %s\n"
 
.data
chainecar:  .int 0   # Double mot, chaine de caracteres
chainecar doit être un tableau assez grand pour stoquer la chaine saisie
 
.text
.global main
 
main:  
pushl  %ebp
movl  %esp,  %ebp
 
presentation:
pushl  $Auteurs
call printf
addl  $4,   %esp  # Desempilement de Auteurs
pushl  $Question
call  printf
addl  $4,   %esp  # Desempilement de Question
 
car:  
pushl  $chainecar  # Empile l adresse de chainecar
pushl  $Chaine   # Empile l adresse de Chaine
call  scanf
resu: addl  $2*4,  %esp  # Desempilement des parametres de scanf
pushl  $chainecar  # Empile adresse de la chaine de caracteres
call  carbin   # Resultat dans EAX
addl  $4,   %esp  # Desempilement du parametre de carbin
pushl  %eax   # Empile la valeur de l entier
pushl  chainecar  # Empile la chaine de caracteres  
pushl  $Resultat1
call  printf
addl  $3*4,   %esp  # Desempilement des parametres de printf
 
 
bin:  
pushl  %eax   # Empile la valeur de l entier
pushl  $chainecar  # Empile l adresse de la chaine resultat
call  bincar   # Chaine de caracteres a l adresse chainecar
addl  $4,   %esp  # Desempilement de l adresse
popl  %eax    # EAX = valeur de l entier
pushl  chainecar   # Empile la chaine resultat
pushl  %eax   # Empile la valeur de l entier
pushl  $Resultat2
call  printf
addl  $3*4,  %esp  # Desempilement des parametres de printf
 
fin:  
leave
ret


 
ce que tu as fait c'est:
 
int chaine;
scanf("%s",&chaine);
 
au lieu de:
 
char chaine[256];  
scanf("%s",chaine);


Message édité par bjone le 14-03-2003 à 18:55:58
n°333754
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 18:57:51  profilanswer
 

je declare chainecar en .string?
y a moyen que ce soit pas initialise?
ou alors j ai interet a y mettre qqch genre des lettres vu que le test d arret d un de mes progs est "ceci n est pas un chiffre"?

n°333756
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 19:00:57  profilanswer
 

il vaut peut etre mieux mettre un caractere d arret a la fin de la chaine saisie au lieu de bouffer plein de memoire en fait :ange:

n°333758
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 19:01:54  profilanswer
 

donc je fais
 
chainecar:   .string   ""
 
:??:

n°333759
bjone
Insert booze to continue
Posté le 14-03-2003 à 19:03:37  profilanswer
 

fo que ce soit un tableau d'octets assez grand pour contenir la chaine (premier problème).
 
ensuite dans ta routine de conversion, si tu tombes sur un caratère non numérique, effectivement fo gueuler sur l'utilisateur, sinon en temps normal la conversion s'arrête sur le NULL (octet à 0) qui a été ajouté par scanf à la fin de la saisie.

n°333764
bjone
Insert booze to continue
Posté le 14-03-2003 à 19:08:15  profilanswer
 

Theorie du chaos a écrit :

donc je fais
 
chainecar:   .string   ""
 
:??:


 
non la il va te déclarer un octet, un NULL (0) car ta chaine est vide.
 
fo que ce soit un truc du style:
 
chainecar: db 256 dup (0)
 
là ça ve te créer une zone de 256 octets à 0.
 
sinon tu peux l'allouer sur la pile aussi :D

n°333768
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 19:11:38  profilanswer
 

pour la version minimale du prog on a le droit de fixer la taille de la chaine et de supposer que l utilisateur est gentil et tape un truc pas trop grand :D
 
je commence a bien me melanger les pinceaux...
 
je lui tape des lettres... il fait conversion en hexa
 
je lui tape une suite de chiffre, il mes memorise en intercalant des zero
 
je lui tape un truc commencant par 0x32... il prend bien le 0x32 et modifie le reste...
 
je dois la taper comment ma chaine?

n°333780
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 19:26:30  profilanswer
 

[:cpu]
 
Starting program: /home/ann1-tc/**/conv  
Ce programme vous est propose par  
Mathieu C et Nadege G
Chaine de caracteres:2
 
Program received signal SIGSEGV, Segmentation fault.
0x4007d9dc in _IO_vfprintf (s=0x4015a180,  
    format=0x8048621 "Valeur de l entier correspondant a la chaine %s : %d\n",  
    ap=0xbffff974) at ../sysdeps/i386/i486/bits/string.h:530
530     ../sysdeps/i386/i486/bits/string.h: No such file or directory.
        in ../sysdeps/i386/i486/bits/string.h
(gdb) display /2wx chainecar
3: x/2xw {<data variable, no debug info>} 134518432
0x3:    Cannot access memory at address 0x3
 

n°333782
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 19:27:11  profilanswer
 

mais je lui ai tape deux :cry:

n°333795
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 19:43:57  profilanswer
 

Chaine de caracteres:2
 
Breakpoint 1, 0x080484fe in sccc ()
(gdb) display /4wx chainecar
3: x/4xw {<data variable, no debug info>} 134518432
0x32:   Cannot access memory at address 0x32
 
et j ai rien change dans le prog :cry:
je v devenir folle :/
 
bon la ca marche...
 
je me demande si je v encore y toucher :d

n°333807
theorie du​ chaos
morte et enterrée
Posté le 14-03-2003 à 20:00:49  profilanswer
 

j ai mon entierrrrrrrrrrrrrrrrrrrrrrrr :bounce:
 
mais j arrive pas encore a l imprimer :lol:

n°333829
bjone
Insert booze to continue
Posté le 14-03-2003 à 20:32:10  profilanswer
 

huh ?
 
po compris là ?
 

n°334039
theorie du​ chaos
morte et enterrée
Posté le 15-03-2003 à 13:48:00  profilanswer
 

j ai teste mon programme...
j arrive maintenant a passe de la chaine de caracteres scannee a la valeur entiere...
mais je n arrive pas a imprimer ce resultat avec printf...
je vais simplifier un peu d abord :)
 
je reviendrai gueuler dans 10 minutes :)

n°334081
bjone
Insert booze to continue
Posté le 15-03-2003 à 15:56:15  profilanswer
 

bah tu push ta valeur dans la pile (pas son adresse)
et tu printf avec "%d"

n°334097
theorie du​ chaos
morte et enterrée
Posté le 15-03-2003 à 16:40:46  profilanswer
 

c est bon c est passe entre temps...

n°334102
theorie du​ chaos
morte et enterrée
Posté le 15-03-2003 à 17:03:33  profilanswer
 

apres etre passe de la chaine a l entier...
je dois retourner a la chaine...
et quand je veux imprimer...
si je demande l impression d un %s ca seg fault
et d un %d ca passe... (mais accessoirement le resultat est faux :d)

n°334110
theorie du​ chaos
morte et enterrée
Posté le 15-03-2003 à 17:47:22  profilanswer
 

est ce que j ai le droit de faire pushl d une chaine de caractere?

n°334112
bjone
Insert booze to continue
Posté le 15-03-2003 à 17:53:54  profilanswer
 

nein, ce que tu fait afficher par printf c'est un entier.
tu pousses sur la pile la valeur elle-même, et tu utilises "%d" ou "%x" suivant que tu veuilles afficher en décimal ou en hexa.
 
si tu utilises "%s" printf va vouloir afficher une chaine à l'adresse qui est la valeur poussé sur la pile (qui forcément n'est pas la même chose)

n°334114
theorie du​ chaos
morte et enterrée
Posté le 15-03-2003 à 17:58:38  profilanswer
 

dans chainecar j ai un truc genre 0x34333231...
et je voudrais qu il me sorte 1234...
 
donc je dois utiliser un %d :??:
 
mais ma variable est dans un string :sweat:

n°334187
bjone
Insert booze to continue
Posté le 15-03-2003 à 21:13:04  profilanswer
 

chainecar c'est ce qui saisi oki ?
 
donc le but de ton exercice c'est faire une conversion chaine ASCII > valeur entière 32 bits ?
 
et ceci via une routine itérative qui multiplie l'ancien entier par 10 et ajoute chaque octet soustrait de '0' non ?
 
et ensuite tu dois afficher la valeur entière 32 bits par un printf non ?  
 
donc normalement, la chaine d'entrée est dans un tampon de -beaucoup- d'octets, la valeur de retour est dans un registre 32 bits ou un DWORD en mémoire, DWORD que tu pousses sur la pile pour l'afficher avec printf naon ?

n°334190
bjone
Insert booze to continue
Posté le 15-03-2003 à 21:15:38  profilanswer
 

ensuite la question est:
 
la chaine saisie est-elle décimale "1231554" ou hexadécimale "4f89c" ?
car du coup la routine de convertion ASCII>entier n'est pas la même...

n°334411
theorie du​ chaos
morte et enterrée
Posté le 16-03-2003 à 14:05:52  profilanswer
 

nein :d
 
je prend la chaine, je la converti en entier, je l affiche
jusque la ca marche...
 
apres je reprends l entier, je le converti en chaine de caractere et je l imprime... c est a l impression que ca foire

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

Aller à :
Ajouter une réponse
 

Sujets relatifs
Programme en javaComparaison de netbeans et JBuilder
[C] Vous voyez une erreur d'algo dans ce programme de calcul en // ?suid dans un programme
créer un programme NETSENDCompilation d un programme vb6
Comment mettre un son en Arriere plan dans un programme CMotorola 68000, aide sur un programme
[C/C++] [Win32 API] Récupérer le nom du dossier contenant ce programmeProgramme sur les polynomes !
Plus de sujets relatifs à : INTEL GNU bug dans un programme... multiplication, comparaison


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)