INTEL GNU bug dans un programme... multiplication, comparaison - ASM - Programmation
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é...
Marsh Posté le 06-03-2003 à 19:06:07
spa juste
pkoi on nous file des corriges avec des fautes :'(
Marsh Posté le 10-03-2003 à 11:53:44
bon je galere un peu
voila le programme...
/*TP1 conversion caractere - binaire - caractere*/ |
j espere pas trop bouziller la presentation
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
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
Marsh Posté le 10-03-2003 à 13:04:16
Theorie du chaos a écrit : pour les comp c des problemes de taille de registre? |
tu pourrais surligner les lignes erronee, paske la retrouver la ligne 60 dans tout ca ben c un peu galere
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
Marsh Posté le 10-03-2003 à 15:58:17
/*TP1 conversion caractere - binaire - caractere*/ |
les commandes sont en majuscule
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
Marsh Posté le 10-03-2003 à 16:04:33
en fait je veux comparer l octet a l adresse indiquee dans ebx
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
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 )
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)
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
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
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 ) donc fo deja que tu copie dans une variable/registre et tu appel ton div dessus
Marsh Posté le 10-03-2003 à 16:29:32
Theorie du chaos a écrit : imul ca fait des multiplications signees... |
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)
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?
Marsh Posté le 10-03-2003 à 16:38:05
Theorie du chaos a écrit : c pas une variable $diviseur? |
si
g encore lu trop vite, je me fouette
(y fait bien 32bits ton diviseur au moins ? )
Citation : Quand ils mettent ca: |
ca veut dire qu'il utilise EDX:EAX comme source (comme si c t un registre de 64bits, quoi)
Marsh Posté le 10-03-2003 à 16:45:29
chrisbk a écrit :
|
pour le diviseur la seule chose c est que je veux qu il vale 10
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
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 |
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
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
Marsh Posté le 10-03-2003 à 17:01:34
Resumons
|
la facture arrivera bientot
(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))
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
bon... maintenant...
|
phase de reflexin amorcee...
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
il aimait pas le .int
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é.
Marsh Posté le 10-03-2003 à 17:10:38
(gdb) run |
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 ()
Marsh Posté le 10-03-2003 à 17:13:00
BJOne a écrit : .equ => constante (#define) |
ah oue...
euh...
achete registre vierge pour programmer
Marsh Posté le 06-03-2003 à 17:43:05
je commence mon TP que j ai a rendre dans deux semaine
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