table conversion en assembleur - ASM - Programmation
Marsh Posté le 28-02-2017 à 08:12:04
Inc fait une incrementation entière et n'ajoute pas 0.5 comme tu le souhaite.
La ligne 'inc x' est incorrecte.
De plus je te conseille d'indenter correctement ton code.
Marsh Posté le 28-02-2017 à 13:42:30
h3bus a écrit : Inc fait une incrementation entière et n'ajoute pas 0.5 comme tu le souhaite. |
je dirais même plus inc n'ajoute pas 0.5 comme je le souhaiterais et donc la ligne inc x n'est pas correcte,
inc x ça donne x=0.5000006 au lieu de x = 1.000 (j'ai regardé avec le débogueur)
de plus j'avais oublié d'indenter le code mdr
j'ai essayé de faire addsd x,0.5 mais ça marche pas
Marsh Posté le 28-02-2017 à 13:50:54
http://c9x.me/x86/html/file_module_x86_id_8.html
Citation : The source operand can be an XMM register or a 64-bit memory location. The destination operand is an XMM register |
Donc il faut que ton x réside dans un registre xmm
Marsh Posté le 28-02-2017 à 13:54:32
h3bus a écrit : http://c9x.me/x86/html/file_module_x86_id_8.html
|
et comment le récuperer en début de boucle ?
si je fais movsd xmm5,x
add xmm5,0.5
............. de plus ça met erreur car le . dans 0.5 ça marche pas
j'ai aussi essayé de faire addsd xmm5,x mais ça marche pas
et de mettre une variable y =0.5 de la mettre dans un registre
et de faire addsd xmm5,xmm6 (dans xmm6 je mets y)
Marsh Posté le 28-02-2017 à 14:05:48
j'ai aussi une autre question je regarde les registres en debogue mais j'arrive pas à les mettre en valeurs decimale
XMM0 = 00000000000000000000000000000000 XMM1 = 00000000000000000000000000000000 XMM2 = 00000000000000000000000000000000 XMM3 = 00000000000000003FE0000000000000 XMM4 = 00000000000000003FE0000000000000 XMM5 = 00000000000000000000000000000000 XMM6 = 00000000000000000000000000000000 XMM7 = 00000000000000000000000000000000
Marsh Posté le 28-02-2017 à 14:14:46
Le contenu de tes registres vaut bien 0.5, tu peux tester ici: https://www.h-schmidt.net/FloatConverter/IEEE754.html
Sinon ADDSD n'accepte pas de valeur immédiate comme opérande source donc ADDSD XMM5, 0.5 est invalide
Par contre tu peux dès le début mettre x dans XMM5 et n'utiliser que XMM5 par la suite.
Ensuite, parce que ADDSD accepte les addresses mémoire comme opérande source, ADDSD XMM5, x est valide (et x vaut toujours 0.5 car tu ne le modifie pas)
Tu n'as plus qu'à déplacer XMM5 dans XMM3 avant ta multiplication.
Marsh Posté le 28-02-2017 à 14:31:19
oui mais xmm5 est remis à 0 lors du deuxième passage et j'ai à chaque tour de boucle la même chose xmm5 vaut 0
Code :
|
Marsh Posté le 28-02-2017 à 14:57:18
Tu veux pas écrire un code propre et bien indenté?
Citation : oui mais xmm5 est remis à 0 lors du deuxième passage |
Quand exactement?
Citation : j'ai à chaque tour de boucle la même chose xmm5 vaut 0 |
Est tu sur?
Je remarque que tu n'affiche jamais XMM5 dans ton code.
Marsh Posté le 28-02-2017 à 15:05:40
ça va ça marche maintenant mais l'affichage ne marche pas . j'indente et quand j'edite ça laisse le code comme avant
push dword ptr resultat +4
push dword ptr resultat
push dword ptr x
push offset acFormatAffichage
call dword ptr printf
add esp,16
Marsh Posté le 28-02-2017 à 16:31:19
Suis pas sur pour l'affichage, tu peux essayer ça:
Code :
|
Marsh Posté le 28-02-2017 à 16:46:28
1>f:\virton\bureau\micro quadri 2\ex2assembleur\ex2assembleur\ex2assembleur.c(354): error C2094: étiquette 'dqword' non définie
mais en plus on a pas vu ces instructions en cours donc ça n'ira pas
comment je peux faire un push de xmm3 ??
Marsh Posté le 28-02-2017 à 17:07:55
Tu connais MOVQ?
Mon code est faux de toutes façon car ça serait un long double qui serait push et non un double comme semble attendre printf.
Je suppose que tu a vu dans ton cours comment push un double?
Marsh Posté le 28-02-2017 à 17:19:19
oui je dois le faire en deux fois
push dword ptr resultat +4
push dword ptr resultat
mais x est dans un registre xmm et ça n'accepte pas de faire de push sur xmm
Marsh Posté le 28-02-2017 à 17:30:23
Sinon en regardant les instructions que tu a mises dans ton premier post:
Code :
|
Marsh Posté le 28-02-2017 à 17:59:57
je dois mettre deux choses au sommet de la pile
resultat et x (x incrementé qui est dans xmm5)
pour resultat je sais comment faire je dois faire
push dword ptr resultat + 4
push dword ptr resultat
(en deux fois car ç'est un double) et ça compte pour 8 quand je touche à esp
je fais des push pour pouvoir executer cette instruction
char acFormatAffichage[]="\n %f euros est egal a : %f francs ";
les deux %f correspondent à xmm5 et à resultat
pour faire un push sur xmm5 je sais pas comment faire
Marsh Posté le 28-02-2017 à 18:16:11
Du coup tu as la solution de movsd xmm3 dans résultat et xmm5 dans une autre variable, puis de push avec ta méthode.
Ça devrait faire la même chose que mon dernier code, mais en passant par des variables intermédiaires (sauf problèmes d'endianness)
Marsh Posté le 28-02-2017 à 18:42:28
oui tu as raison merci pour ton aide car je devais utiliser un peu plus de variables intermédiaires pour stoker et pas perdre mes variables merci mon code marche bien maintenant et l'affichage aussi
j'ai utilisé un peu plus de variables intermédiaires
Marsh Posté le 28-02-2017 à 03:56:30
Produire une petite table de conversion euro/franc allant de 0,5 à 10 euros par pas de 0.5
bonsoir
est ce que quelqu'un peut m'aider je n'arrive pas à incrementer ma variable x de 0.5 à chaque passage dans la boucle
x est le montant en euros que je dois multiplier par la variable francs (40.3399)
x vaut 0.5 je mets le debogeur
j'ai essayé de voir les registres mais j'arrive pas à les mettre en valeurs decimales (xmm0 ...
j'ai regardé avec le debogueur et le inc x ça donne x=0.5000006 au lieu de x = 1.000
et quand ça repasse dans la boucle le inc x ça donne x = 0.5000012 au lieu de x = 1.5000
je n'arrive pas à incrementer de 0.5
Message édité par bjs le 28-02-2017 à 14:24:04