table conversion en assembleur

table conversion en assembleur - ASM - Programmation

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  
 
 

Code :
  1. #include <stdio.h>
  2.     int nbl=11;
  3. double francs=40.3399;
  4. int i =1;
  5. double x=0.0;//problème avec increase si float x = 0.5 comment ecrire les virgules et incrementer x et pas x= 0.51
  6. double resultat;
  7. double y =0.5;
  8. char acFormatAffichage[]="\n%f euros est egal a : %f francs ";
  9. void main()
  10. {
  11. _asm
  12. {
  13.        movsd xmm3,x   
  14.     debutbcl:
  15.          
  16.    
  17.        
  18.         addsd xmm3,y
  19.     movsd xmm4,xmm3
  20.         cmp i,11
  21.         jnb finbcl
  22.     mulsd xmm4, francs
  23.     movsd xmm5,xmm4
  24.     movsd resultat,xmm5
  25.         push dword ptr resultat +4
  26.            push dword ptr resultat
  27.            push dword ptr x
  28.         push offset acFormatAffichage
  29.            call dword ptr printf
  30.            add esp,16
  31.  
  32.            inc i
  33.            jmp debutbcl
  34.     finbcl:
  35.          mov i,12
  36.    }     scanf("%d",&i);
  37. }


Message édité par bjs le 28-02-2017 à 14:24:04
Reply

Marsh Posté le 28-02-2017 à 03:56:30   

Reply

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.

Message cité 1 fois
Message édité par h3bus le 28-02-2017 à 16:40:43

---------------
sheep++
Reply

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.
La ligne 'inc x' est incorrecte.
 
De plus je te conseille d'inventer correctement ton code.


 
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


Message édité par bjs le 28-02-2017 à 13:51:23
Reply

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


---------------
sheep++
Reply

Marsh Posté le 28-02-2017 à 13:54:32    

h3bus a écrit :

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


 
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)


Message édité par bjs le 28-02-2017 à 13:56:07
Reply

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

Reply

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.


Message édité par h3bus le 28-02-2017 à 14:16:50

---------------
sheep++
Reply

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 :
  1. #include <stdio.h>
  2.  int nbl=11;
  3.  double francs=40.3399;
  4.  int i =1;
  5.  double x=0.5;
  6.  double resultat;
  7.  double y =0.5;
  8.  char acFormatAffichage[]="\n%f euros est egal a : %f francs ";
  9. void main()
  10. {
  11. _asm
  12. {
  13.         movsd xmm3,x
  14.      debutbcl:
  15.   
  16.         cmp i,11
  17.         jnb finbcl
  18.         movsd xmm5,xmm3
  19.        mulsd xmm5, francs
  20.   
  21.        movsd resultat,xmm5
  22.         push dword ptr resultat +4
  23.             push dword ptr resultat
  24.          
  25.         push offset acFormatAffichage
  26.              call dword ptr printf
  27.                add esp,12
  28.                addsd xmm3,x
  29.                inc i
  30.                jmp debutbcl
  31.      finbcl:
  32.          mov i,12
  33.    }     scanf("%d",&i);
  34. }


Message édité par bjs le 28-02-2017 à 18:00:31
Reply

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.


---------------
sheep++
Reply

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


Message édité par bjs le 28-02-2017 à 15:08:32
Reply

Marsh Posté le 28-02-2017 à 15:05:40   

Reply

Marsh Posté le 28-02-2017 à 16:31:19    

Suis pas sur pour l'affichage, tu peux essayer ça:

Code :
  1. _asm
  2. {
  3.     movsd xmm5, x
  4. debutbcl:
  5.     cmp     i,11
  6.     jnb     finbcl
  7.     movsd   xmm3,xmm5
  8.     mulsd   xmm3, francs
  9.     sub     esp, 16 //push xmm3
  10.     movdqu  dqword [esp], xmm3
  11.     sub     esp, 16 // push xmm5
  12.     movdqu  dqword [esp], xmm5
  13.     push    dword ptr acFormatAffichage
  14.     call    printf
  15.     add     esp, 36
  16.     addsd   xmm5,x
  17.     inc     i
  18.     jmp     debutbcl
  19. finbcl:
  20. }


Message édité par h3bus le 28-02-2017 à 16:31:41

---------------
sheep++
Reply

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


Message édité par bjs le 28-02-2017 à 16:48:12
Reply

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?


---------------
sheep++
Reply

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


Message édité par bjs le 28-02-2017 à 17:19:48
Reply

Marsh Posté le 28-02-2017 à 17:30:23    

Sinon en regardant les instructions que tu a mises dans ton premier post:

Code :
  1. _asm
  2. {
  3.     movsd xmm5, x
  4. debutbcl:
  5.     cmp     i,11
  6.     jnb     finbcl
  7.     movsd   xmm3,xmm5
  8.     mulsd   xmm3, francs
  9.     sub     esp, 8 // push xmm3.L
  10.     movsd   [esp], xmm3
  11.     sub     esp, 8 // push xmm5.L
  12.     movsd   [esp], xmm5
  13.     push    dword ptr acFormatAffichage
  14.     call    printf
  15.     add     esp, 20
  16.     addsd   xmm5,x
  17.     inc     i
  18.     jmp     debutbcl
  19. finbcl:
  20. }


Message édité par h3bus le 28-02-2017 à 17:30:38

---------------
sheep++
Reply

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


Message édité par bjs le 28-02-2017 à 18:13:06
Reply

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)


---------------
sheep++
Reply

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


Message édité par bjs le 28-02-2017 à 18:44:09
Reply

Sujets relatifs:

Leave a Replay

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