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

  FORUM HardWare.fr
  Programmation
  ASM

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

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Précédente
Auteur Sujet :

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

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

je commence mon TP que j ai a rendre dans deux semaine :d
j aurais qqes tites questions...
 
dans un exemple de mon prof.. il definit au debut
 
.data
.lcomm par,4
 
 
pourquoi c est pas dans un .bss
par est pas cense etre une variable non initialisee?


Message édité par theorie du chaos le 10-03-2003 à 12:32:14
mood
Publicité
Posté le 06-03-2003 à 17:43:05  profilanswer
 

n°325010
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-03-2003 à 18:24:02  profilanswer
 

dans .data, tu colles les variables initialisées, et dans .bss tu colles les non initialisées.
donc effectivement, ton prof s'est loupé...


---------------
J'ai un string dans l'array (Paris Hilton)
n°325039
theorie du​ chaos
morte et enterrée
Posté le 06-03-2003 à 19:06:07  profilanswer
 

spa juste :cry:
 
pkoi on nous file des corriges avec des fautes :'(

n°328157
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 11:53:44  profilanswer
 

bon je galere un peu :D
voila le programme...
 

/*TP1 conversion caractere - binaire - caractere*/
 
/*Version minimale: entiers non signes, pas de verification du nombre de chiffres de la chaine*/
 
 
/*programme de conversion caractere - binaire*/
 
 .equ  multiplieur, 10
 
 .text
 .global carbin
 .set  n,  8  
carbin:  
 pushl  %ebp
 movl  %esp,  %ebp
 xorl  %eax,  %eax # Mise a zero de EAX
 
itercarbin:
 movl  n(%ebp),%ebx  # Deplacement de n dans la pile, EBX = adresse de var
 cmpb  $0x30,  *%ebx  # Compare ce qui est a l adresse indiquee dans EBX
 jl  fincarbin
 cmpb  $0x39,  *%ebx
 jg  fincarbin
 movb  *%ebx,  %ecx  # ECX = octet de la chaine de caracteres /!\verifier qu il est complete par des 0
 subl  $0x30,  %ecx  # code caractere
 mull  $multiplieur # EAX = 10*EAXprecedent
 addl  %ecx,  %eax
 addl  $1,  %ebx # EBX = adresse de l octet suivant de var
 jmp  itercarbin # On boucle  
 
fincarbin:
 leave
 ret
 
 
 
/*programme de conversion binaire - caractere*/
 
 
 .equ  diviseur, 10
 
 .text
 .global bincar
 .set  d, 7
 .set  n,  8  # Deplacement de n dans la pile
bincar:  
 pushl  %ebp
 movl  %esp,  %ebp
 
iterbincar:
 movl  n(%ebp),%ebx  # EBX = adresse de var
 .set  n,  n*2  # Deplacement de 2n dans la pile
 movl  n(%ebp),%eax  # EAX = valeur de l entier
 movl  7(%ecx),%ecx  # ECX = reste de la division par 10 de l entier
 addb  $0x30,  d(%ecx) # le dieme octet de ECX contient le code
 .set  d,  d-1 # d = d-1
 divl  $diviseur  # EAX = EAXprecedent/10
 cmp  $0,  %eax
 jne  interbincar  # On boucle tant que l entier est different de 0
 movl  %ecx ,*%ebx # chaine resultat copiee a l adresse var
 
finbincar:
 leave
 ret
 
 
 
/*programme principal*/
 
 
 .section .rodata
Auteurs:  .string "Ce programme vous est porpose par \n Mathieu Chondroyannis et Nadege Griesser\n"
Question: .string "Chaine de caracteres:"
Reponse1:  .string "%d"
Resultat1:  .string "Valeur de l entier correspondant a la chaine %s : %d\n"
Reponse2: .string "%s"
Resultat2: .string "Chaine de caracteres correspondant a l entier %d : %s\n"
 
 .bss
 .lcomm  var, 4 # Reserve 4 octets a l adresse var
 
 
 .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  $var  # Empile l adresse de var
 pushl  $Reponse1
 call  scanf  # var = chaine de caracteres
 addl  $2*4, %esp  # Desempilement des parametres de scanf
 pushl  $var  # Empile adresse de la chaine de caracteres
 call  carbin   # Resultat (nombre entier) dans EAX
 addl  $4,  %esp  # Desempilement des parametres de carbin
 pushl  %eax  # Empile la valeur de l entier
 pushl  var  # 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  $var  # Empile l adresse ou l on mettra la chaine resultat
 call  bincar  # Chaine de caracteres a l adresse var
 addl  $4,  %esp  # Desempilement de l adresse
 popl  %eax   # EAX = valeur de l entier
 pushl  var   # 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


j espere pas trop bouziller la presentation [:totoz]
j ai ces erreurs la...
 
conver.s: Assembler messages:
conver.s:20: Error: suffix or operands invalid for `cmp'
conver.s:22: Error: suffix or operands invalid for `cmp'
conver.s:24: Error: suffix or operands invalid for `mov'
conver.s:26: Error: suffix or operands invalid for `mul'
conver.s:57: Error: suffix or operands invalid for `div'
conver.s:60: Error: suffix or operands invalid for `mov'
 
et je sais pas quoi faire :cry:

n°328171
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 12:24:53  profilanswer
 

pour les comp c des problemes de taille de registre?
 
pour div et mul je vois pas :/

n°328196
chrisbk
-
Posté le 10-03-2003 à 13:04:16  profilanswer
 

Theorie du chaos a écrit :

pour les comp c des problemes de taille de registre?
 
pour div et mul je vois pas :/


 
tu pourrais surligner les lignes erronee, paske la retrouver la ligne 60 dans tout ca ben c un peu galere :D

n°328228
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 10-03-2003 à 13:56:39  profilanswer
 

un document décrivant la syntaxe utilisée par l'assembleur GNU :
 
http://www.c-for-dummies.com/compilers/djgpp_asm.html


---------------
J'ai un string dans l'array (Paris Hilton)
n°328356
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 15:58:17  profilanswer
 

/*TP1 conversion caractere - binaire - caractere*/
 
/*Version minimale: entiers non signes, pas de verification du nombre de chiffres de la chaine*/
 
 
/*programme de conversion caractere - binaire*/
 
 .equ  multiplieur, 10
 
 .text
 .global carbin
 .set  n,  8  
carbin:  
 pushl  %ebp
 movl  %esp,  %ebp
 xorl  %eax,  %eax # Mise a zero de EAX
 
itercarbin:
 movl  n(%ebp),%ebx  # Deplacement de n dans la pile, EBX = adresse de var
 CMPB $0x30,  *%ebx  # Compare ce qui est a l adresse indiquee dans EBX
 jl  fincarbin
 CMPB  $0x39,  *%ebx
 jg  fincarbin
 movb  *%ebx,  %ecx  # ECX = octet de la chaine de caracteres  
 subl  $0x30,  %ecx  # code caractere
 MULL  $multiplieur # EAX = 10*EAXprecedent
 addl  %ecx,  %eax
 addl  $1,  %ebx # EBX = adresse de l octet suivant de var
 jmp  itercarbin # On boucle  
 
fincarbin:
 leave
 ret
 
 
 
/*programme de conversion binaire - caractere*/
 
 
 .equ  diviseur, 10
 
 .text
 .global bincar
 .set  d, 7
 .set  n,  8  # Deplacement de n dans la pile
bincar:  
 pushl  %ebp
 movl  %esp,  %ebp
 
iterbincar:
 movl  n(%ebp),%ebx  # EBX = adresse de var
 .set  n,  n*2  # Deplacement de 2n dans la pile
 movl  n(%ebp),%eax  # EAX = valeur de l entier
 movl  7(%ecx),%ecx  # ECX = reste de la division par 10 de l entier
 addb  $0x30,  d(%ecx) # le dieme octet de ECX contient le code
 .set  d,  d-1 # d = d-1
 DIVL  $diviseur # EAX = EAXprecedent/10
 cmpl  $0,  %eax
 jne  interbincar  # On boucle tant que l entier est different de 0
 movl  %ecx ,*%ebx # chaine resultat copiee a l adresse var
 
finbincar:
 leave
 ret
 
 
 
/*programme principal*/
 
 
 .section .rodata
Auteurs:  .string "Ce programme vous est porpose par \n Mathieu  et Nadege \n"
Question: .string "Chaine de caracteres:"
Reponse1:  .string "%d"
Resultat1:  .string "Valeur de l entier correspondant a la chaine %s : %d\n"
Reponse2: .string "%s"
Resultat2: .string "Chaine de caracteres correspondant a l entier %d : %s\n"
 
 .bss
 .lcomm  var, 4 # Reserve 4 octets a l adresse var
 
 
 .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  $var  # Empile l adresse de var
 pushl  $Reponse1
 call  scanf  # var = chaine de caracteres
 addl  $2*4, %esp  # Desempilement des parametres de scanf
 pushl  $var  # Empile adresse de la chaine de caracteres
 call  carbin   # Resultat (nombre entier) dans EAX
 addl  $4,  %esp  # Desempilement des parametres de carbin
 pushl  %eax  # Empile la valeur de l entier
 pushl  var  # 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  $var  # Empile l adresse ou l on mettra la chaine resultat
 call  bincar  # Chaine de caracteres a l adresse var
 addl  $4,  %esp  # Desempilement de l adresse
 popl  %eax   # EAX = valeur de l entier
 pushl  var   # 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


les commandes sont en majuscule


Message édité par theorie du chaos le 10-03-2003 à 16:02:01
n°328357
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:00:14  profilanswer
 

je peux pas mettre en gras :/

n°328367
chrisbk
-
Posté le 10-03-2003 à 16:03:09  profilanswer
 

CMPB $0x30,  *%ebx  
 
ebx c un reg 32bits et B ca doit signifier byte (soit 8bits)
d'ou soucis non ?
 
d'apres le lien poste par harko fo que tu suffixe avec un fin l


Message édité par chrisbk le 10-03-2003 à 16:04:32
mood
Publicité
Posté le 10-03-2003 à 16:03:09  profilanswer
 

n°328369
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:04:33  profilanswer
 

en fait je veux comparer l octet a l adresse indiquee dans ebx

n°328370
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:05:18  profilanswer
 

si je mets l ca va comparer le double mot je crois

n°328374
chrisbk
-
Posté le 10-03-2003 à 16:08:32  profilanswer
 

vi, j'avais pas fait gaffe au * et g edite avant ton message
 
Bon, pour essayer d'etre un peu moins inutile que maintenant, j'ai l'impression que tu veux faire :
cmp 0x30,byte PTR[ebx] (je connais que l'intel)
 
et visiblement d'apres le lien, ca devrait s'ecrire :
 
cmpb (%ebx),$0x30
 
 
Si c pas ca ben tant pis :D
 

n°328379
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:10:36  profilanswer
 

je v tester :d

n°328385
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:12:24  profilanswer
 

ca passe a l assemblage :evil:

n°328389
chrisbk
-
Posté le 10-03-2003 à 16:13:44  profilanswer
 

g fait ma B.A. de la journée [:yaisse2] [:yaisse3]
 
 

n°328397
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:15:28  profilanswer
 

et pour les multiplications? :ange:

n°328411
chrisbk
-
Posté le 10-03-2003 à 16:21:39  profilanswer
 

DIV est une grosse instruction caca qui est tres regardante au niveau de ce que tu lui donne a manger et qui te sacage tout un tas de registre
 
pour rapel :
 
idiv r/m
 
equivaut a :  
eax = quotient [edx:eax] / (r/m)
edx = rest     [edx:eax] / (r/m)
 
r/m = registre / memoire
donc deja pour faire un idiv faut mettre ton dividande dans EAX. Si celui ci fait 32bits alors tu fais cdq pour le passer en 64(ca ecrase EDX)
ensuite tu fais donc div en passant une val 32bits
 
(je te dis tout ca de tete, manque de bol je connais que la version 32bits. en 8 je sais pas si ca passe, a la rigueur c pas grave, diviser par 0x5 pour 0x0005 ca change pas grand chose :D)
 
sinon essaye en remplacant tes mul par imul, cette derniere est plus flexible (me semble il. En tout cas c celle que j'utilise avec un certain bonheur)
 
 
 
 

n°328420
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:25:08  profilanswer
 

je savais pas pour le quotient et le reste :love: :love:

n°328421
chrisbk
-
Posté le 10-03-2003 à 16:25:53  profilanswer
 

http://webster.cs.ucr.edu/Page_Tec [...] /idiv.html
 
tout est savemment explique sur ce site

n°328422
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:25:55  profilanswer
 

imul ca fait des multiplications signees...
je verrai ca quand je ferai le cas de relatifs :sweat:

n°328428
chrisbk
-
Posté le 10-03-2003 à 16:27:25  profilanswer
 

en fait idiv n'accepte pas de variable immediate (j'aurais du le savoir je l'ai encoder hier :D) donc fo deja que tu copie dans une variable/registre et tu appel ton div dessus

n°328432
chrisbk
-
Posté le 10-03-2003 à 16:29:32  profilanswer
 

Theorie du chaos a écrit :

imul ca fait des multiplications signees...
je verrai ca quand je ferai le cas de relatifs :sweat:


ben tu prends ca :
 
http://webster.cs.ucr.edu/Page_Tec [...] 6/mul.html
 
tu regarde bien comment ca marche pour ta taille d'operande
 
ca t'apprends aussi que mul ne veut pas d'operande immediate (genre 0x20) mais que des regs / vars
 
MUL AL,r/m8    
 
r/m8 = registre ou position memoire 8bits
imm8 = variable immediate (vu que c pas indique c que l'instruction ne supporte pas)


Message édité par chrisbk le 10-03-2003 à 16:30:06
n°328440
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:34:48  profilanswer
 

c pas une variable $diviseur?
 
 
Quand ils mettent ca:
Unsigned divide EDX:EAX by r/m
 
ca veut dire quoi EDX:EAX ?
ca divise les deux registres?

n°328446
chrisbk
-
Posté le 10-03-2003 à 16:38:05  profilanswer
 

Theorie du chaos a écrit :

c pas une variable $diviseur?


 
si :D
g encore lu trop vite, je me fouette :O
(y fait bien 32bits ton diviseur au moins :D? )
 
 

Citation :

Quand ils mettent ca:
Unsigned divide EDX:EAX by r/m
 
ca veut dire quoi EDX:EAX ?
ca divise les deux registres?


ca veut dire qu'il utilise EDX:EAX comme source (comme si c t un registre de 64bits, quoi)


Message édité par chrisbk le 10-03-2003 à 16:40:09
n°328470
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:45:29  profilanswer
 

chrisbk a écrit :


 
si :D
g encore lu trop vite, je me fouette :O
(y fait bien 32bits ton diviseur au moins :D? )
 
 

Citation :

Quand ils mettent ca:
Unsigned divide EDX:EAX by r/m
 
ca veut dire quoi EDX:EAX ?
ca divise les deux registres?


ca veut dire qu'il utilise EDX:EAX comme source (comme si c t un registre de 64bits, quoi)

pour le diviseur la seule chose c est que je veux qu il vale 10 :ange:

n°328475
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:46:47  profilanswer
 

si je mets .int a la place de .equ il veut pas non plus...
bon... v tout lire :d

n°328486
chrisbk
-
Posté le 10-03-2003 à 16:53:18  profilanswer
 

Theorie du chaos a écrit :

pour le diviseur la seule chose c est que je veux qu il vale 10 :ange:


 
attends g un doute. G jamais fait de prog 100% asm (tjs de l'inline), donc je me demande ce que :
 
.equ  diviseur, 10  
 
signifie. ca te refile une constante ou une variable ?
si c une constante alors c normal, essaye de faire un fin :
movl $diviseur, %ebx
divl %ebx
 
 

n°328489
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:56:46  profilanswer
 

en fait je me basais sur un exemple de mon poly :
 
.equ TAILLE, 4
movl %ecx, %eax
mull $taille
 
huuuuuuum je viens de recopier exactement et je me dis que les majuscules c ptet louche dans le cours...
 
bon j essaie avec ce que tu as dit

n°328492
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 16:58:25  profilanswer
 

ca passe...
 
vive mon cours :o

n°328501
chrisbk
-
Posté le 10-03-2003 à 17:01:34  profilanswer
 

Resumons :sol:
 


debut de l'intervention personnalise : 16:03
fin de l'intervention personnalise : 16:59


 
la facture arrivera bientot :O
 
(ben ton cours, ton cours, si les .int alloue une constante c normal que ca passe pas, vu que div elle aime pas ca (saloperie d'instruction a la con))

n°328511
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 17:04:05  profilanswer
 

et MUL non plus elle aime pas...
 
mon prof a quand meme un super ordi qui laisse tout passer [:paysan]
 
 
bon... maintenant...


/tmp/ccE82Erf.o: In function `fincarbin':
/tmp/ccE82Erf.o(.text+0x27): undefined reference to `diviseur'
/tmp/ccE82Erf.o: In function `iterbincar':
/tmp/ccE82Erf.o(.text+0x40): undefined reference to `diviseur'
/tmp/ccE82Erf.o(.text+0x4b): undefined reference to `interbincar'
collect2: ld returned 1 exit status


 
phase de reflexin amorcee...

n°328518
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 17:08:13  profilanswer
 

/tmp/ccRw2cRa.o: In function `iterbincar':
/tmp/ccRw2cRa.o(.text+0x43): undefined reference to `interbincar'
 
 
reste plus que ca :d
 
il aimait pas le .int :evil:

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

y a un n en trop :cry:

n°328522
bjone
Insert booze to continue
Posté le 10-03-2003 à 17:10:26  profilanswer
 

.equ => constante (#define)
 
attention div avec opérande 32 bits divise (edx:eax) par l'opérande et retourne dans edx et eax.
idem pour mul, edx:eax est modifié.
 

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

(gdb) run
Starting program: /home/ann1-tc/ngriesse/conver  
Ce programme vous est porpose par  
 Mathieu Chondroyannis et Nadege Griesser
Chaine de caracteres:34526791
 
Program received signal SIGSEGV, Segmentation fault.
0x4007d9dc in _IO_vfprintf (s=0x4015a180,  
    format=0x804861f "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


 
:sol:

n°328525
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 17:11:52  profilanswer
 

Chaine de caracteres:0x3532363937
Valeur de l entier correspondant a la chaine (null) : 0
 
Program received signal SIGSEGV, Segmentation fault.
0x080484c0 in iterbincar ()
 
 
:sol: :sol:

n°328527
theorie du​ chaos
morte et enterrée
Posté le 10-03-2003 à 17:13:00  profilanswer
 

BJOne a écrit :

.equ => constante (#define)
 
attention div avec opérande 32 bits divise (edx:eax) par l'opérande et retourne dans edx et eax.
idem pour mul, edx:eax est modifié.
 
 

ah oue... :d
 
 
euh...
 
achete registre vierge pour programmer :d

n°329338
theorie du​ chaos
morte et enterrée
Posté le 11-03-2003 à 11:15:39  profilanswer
 

ca veut dire quoi exactement segmentation fault?

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

que t'essaye de lire/ecrire la ou t'as pas droit

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

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

 

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-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR