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

INTEL GNU bug dans un programme... multiplication, comparaison - ASM - Programmation

Marsh Posté le 06-03-2003 à 17:43:05    

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
Reply

Marsh Posté le 06-03-2003 à 17:43:05   

Reply

Marsh Posté le 06-03-2003 à 18:24:02    

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)
Reply

Marsh Posté le 06-03-2003 à 19:06:07    

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

Reply

Marsh Posté le 10-03-2003 à 11:53:44    

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:

Reply

Marsh Posté le 10-03-2003 à 12:24:53    

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

Reply

Marsh Posté le 10-03-2003 à 13:04:16    

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

Reply

Marsh Posté le 10-03-2003 à 13:56:39    

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)
Reply

Marsh Posté le 10-03-2003 à 15:58:17    

/*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
Reply

Marsh Posté le 10-03-2003 à 16:00:14    

je peux pas mettre en gras :/

Reply

Marsh Posté le 10-03-2003 à 16:03:09    

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
Reply

Marsh Posté le 10-03-2003 à 16:03:09   

Reply

Marsh Posté le 10-03-2003 à 16:04:33    

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

Reply

Marsh Posté le 10-03-2003 à 16:05:18    

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

Reply

Marsh Posté le 10-03-2003 à 16:08:32    

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
 

Reply

Marsh Posté le 10-03-2003 à 16:10:36    

je v tester :d

Reply

Marsh Posté le 10-03-2003 à 16:12:24    

ca passe a l assemblage :evil:

Reply

Marsh Posté le 10-03-2003 à 16:13:44    

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

Reply

Marsh Posté le 10-03-2003 à 16:15:28    

et pour les multiplications? :ange:

Reply

Marsh Posté le 10-03-2003 à 16:21:39    

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)
 
 
 
 

Reply

Marsh Posté le 10-03-2003 à 16:25:08    

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

Reply

Marsh Posté le 10-03-2003 à 16:25:53    

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

Reply

Marsh Posté le 10-03-2003 à 16:25:55    

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

Reply

Marsh Posté le 10-03-2003 à 16:27:25    

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

Reply

Marsh Posté le 10-03-2003 à 16:29:32    

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
Reply

Marsh Posté le 10-03-2003 à 16:34:48    

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?

Reply

Marsh Posté le 10-03-2003 à 16:38:05    

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
Reply

Marsh Posté le 10-03-2003 à 16:45:29    

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:

Reply

Marsh Posté le 10-03-2003 à 16:46:47    

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

Reply

Marsh Posté le 10-03-2003 à 16:53:18    

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
 
 

Reply

Marsh Posté le 10-03-2003 à 16:56:46    

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

Reply

Marsh Posté le 10-03-2003 à 16:58:25    

ca passe...
 
vive mon cours :o

Reply

Marsh Posté le 10-03-2003 à 17:01:34    

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))

Reply

Marsh Posté le 10-03-2003 à 17:04:05    

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...

Reply

Marsh Posté le 10-03-2003 à 17:08:13    

/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:

Reply

Marsh Posté le 10-03-2003 à 17:09:14    

y a un n en trop :cry:

Reply

Marsh Posté le 10-03-2003 à 17:10:26    

.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é.
 

Reply

Marsh Posté le 10-03-2003 à 17:10:38    

(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:

Reply

Marsh Posté le 10-03-2003 à 17:11:52    

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:

Reply

Marsh Posté le 10-03-2003 à 17:13:00    

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

Reply

Marsh Posté le 11-03-2003 à 11:15:39    

ca veut dire quoi exactement segmentation fault?

Reply

Marsh Posté le 11-03-2003 à 11:26:26    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed