[assembleur] Gestion postion souris + Affichage [Need Help] -> Page 2

-> Page 2 [assembleur] Gestion postion souris + Affichage [Need Help] - ASM - Programmation

Marsh Posté le 30-11-2002 à 13:52:23    

Bonjour
 
Je suis tres nul en assembleur, ca fait pas lgtps que l'on a commencé ca en cours,
J'ai deux prog a realiser.
Le premier c'est:
 
[quote]Pour une donnée representant un nombre reel positif, on vous demande, de rediger un programme qui calcul approximativement le logarithme d'un nombre
Le nombre peut etre quelconque (0.040=<X=<0.5)
 
On se limite aux 6 premiers termes du dev de Mac Laurin
 
ln(x+1)=X - x²/2! + 2(x*x*x)/3! - 6(x*x*x*x)/4! et etc...
 
Voici le programme que j'ai fait pour ca
 

Code :
  1. ;
  2. ; Keyaert Christopher
  3. ;
  4. .model small
  5. .stack 100h
  6. ;------------------------------------------------
  7. ;-  Lmi 2 ex 1                                  -
  8. ;-   Calcul du logarithme d'un nombre           -
  9. ;-   ln(x+1) = x- (x*x)/2! + 2(x*x*x)/3!        -
  10. ;-              - 6(x*x*x*x)/4! etc....         -
  11. ;------------------------------------------------
  12. .data
  13. X DW 500 ;variable de Valeur 1000 fois plus gd que
  14. two DW 2 ;variable de valeur 2
  15. three DW 3 ;variable de valeur 3
  16. four DW 4 ;variable de valeur 4
  17. five DW 5 ;variable de valeur 5
  18. six DW 6 ;variable de valeur 6
  19. mil DW 1000 ;variable de valeur 1000
  20. t1 DW ? ;variable inconnue determiner apres
  21. calcul 1
  22. t2 DW ? ;variable inconnue determiner apres
  23. calcul 2
  24. t3 DW ? ;variable inconnue determiner apres
  25. calcul 3
  26. t4 DW ? ;variable inconnue determiner apres
  27. calcul 4
  28. t5 DW ? ;variable inconnue determiner apres
  29. calcul 5
  30. t6 DW ? ;variable inconnue determiner apres
  31. calcul 6
  32. ln DW  ? ;Varialbe inconnue determiner par le
  33. programme
  34. .code
  35. ;------------------------------------------------
  36. ;- Procedure principale                         -
  37. ;------------------------------------------------
  38. main    proc
  39.   MOV   AX,@data
  40.   MOV   DS,AX
  41. ;------------------------------------------------
  42. ;- Calcul du terme 1                            -
  43. ;------------------------------------------------
  44.   MOV   AX,X   ;place la valeur X dans le registre AX
  45.   MOV   t1,AX   ;Place la valeur X dans t1
  46. ;------------------------------------------------
  47. ;- Calcul du terme 2                            -
  48. ;------------------------------------------------
  49.   MOV   AX,t1
  50.   MUL   X
  51.   DIV   two
  52.   MOV   t2,AX
  53. ;------------------------------------------------
  54. ;- Calcul du terme 3                            -
  55. ;------------------------------------------------
  56.  
  57.   MOV   AX,t2
  58.   MUL   two
  59.   MUL   X
  60.   DIV   three
  61.   MOV   t3,AX
  62. ;------------------------------------------------
  63. ;- Calcul du terme 4                            -
  64. ;------------------------------------------------
  65.   MOV   AX,t3
  66.   MUL   three
  67.   MUL   X
  68.   DIV   four
  69.   MOV   t4,AX
  70. ;------------------------------------------------
  71. ;- Calcul du terme 5                            -
  72. ;------------------------------------------------
  73.  
  74.   MOV   AX,t4
  75.   MUL   four
  76.   MUL   X
  77.   DIV   five
  78.   MOV   t5,AX
  79. ;------------------------------------------------
  80. ;- Calcul du terme 6                            -
  81. ;------------------------------------------------
  82.   MOV   AX,t5
  83.   MUL   five
  84.   MUL   X
  85.   DIV   six
  86.   MOV   t6,AX
  87. ;------------------------------------------------
  88. ;- Calcul du terme final                        -
  89. ;------------------------------------------------
  90.  
  91.   MOV    AX,t1
  92.   SUB    AX,t2
  93.   ADD    AX,t3
  94.   SUB    AX,t4
  95.   ADD    AX,t5
  96.   SUB    AX,t6
  97.   ;DIV    mil
  98.   MOV    ln,AX  ;reponse final
  99. ;------------------------------------------------
  100. ;-      Fin du programme                        -
  101. ;------------------------------------------------
  102.   MOV   AX,04C00h
  103.   INT   21h
  104. main endp
  105. end main


 
Ca compile, ca link bien, mais a l'execution j'ai "Dépassement de divition :("
 
Vous avez une idée? merci.


Message édité par Le Veilleur le 04-12-2002 à 20:02:46

---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 13:52:23   

Reply

Marsh Posté le 30-11-2002 à 14:26:20    

Quelle idée de forcer les gens à apprendre l'asm  :sarcastic:


---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 30-11-2002 à 14:29:42    

Oui je sais mais j'ai pas le choix, c'est pas moi qui decide de mes cours :(


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 14:29:49    

ITM a écrit a écrit :

Quelle idée de forcer les gens à apprendre l'asm  :sarcastic:  




C'est une bonne idée.
Ok, ca n'a l'air de servir a rien, comme ca.
Ok, tu n'en feras probablement plus apres ces 2/3 cours.
Ok, tu te limites a quelques notions
 
N'empeche que j'ai eu droit a quelques tps et cours avant d'aborder le C, ben ca simplifie énormément. Pas besoin d'expliquer les pointeurs et les opérations associées, vu qu'on connait déja leur fonctionnement.
 
Par contre pour répondre a la question initiale, je ne sais pas. J'ai bien evidemment tout oublié :o
Essaye voir de regarder les flags dans un debugger a tout hasard, pour savoir au moins ou est l'erreur.

Reply

Marsh Posté le 30-11-2002 à 14:48:04    

Apprendre l'assembleur est bien pratique... Quand je voyais en IUT les gus en chier pour percuter la notion de pointeur en C, je me marrais bien...
J'avais 2 ans d'asm Motorola dans les dents, et ça m'a permis de comprendre bien des choses !
Enfin bref !
 
Pour apporter un début de solution au problème :
 
Ce genre de truc est à éviter :

Citation :


MOV   AX,t1  
MUL   X  
DIV   two  
MOV   t2,AX


 
En effet : tu effectues une multiplication de 2 opérandes 16 bits, ce qui fait que ton résultat sera sur 32 bits, et sera donc stocké dans 2 registres : DX pour la partie forte et AX pour la partie faible.
 
Tu dois donc tenir compte dans ta division que l'opérande est sur 4 octets.
 
Je peux rien tester, vu que j'ai pas d'assembleur sous la main. Je vais m'installer nasm32 (coucou Lorill :d)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-11-2002 à 14:56:47    

merci
des reponses
 
petites modif au prog
 

Code :
  1. ;
  2. ; Keyaert Christopher
  3. ;
  4. .model small
  5. .stack 100h
  6. ;------------------------------------------------
  7. ;-  Lmi 2 ex 1                                  -
  8. ;-   Calcul du logarithme d'un nombre           -
  9. ;-   ln(x+1) = x- (x*x)/2! + 2(x*x*x)/3!        -
  10. ;-              - 6(x*x*x*x)/4! etc....         -
  11. ;------------------------------------------------
  12. .data
  13. X DW 500 ;variable de Valeur 1000 fois plus gd que
  14. two DW 2 ;variable de valeur 2
  15. three DW 3 ;variable de valeur 3
  16. four DW 4 ;variable de valeur 4
  17. five DW 5 ;variable de valeur 5
  18. six DW 6 ;variable de valeur 6
  19. mil DW 1000 ;variable de valeur 1000
  20. t1 DW ? ;variable inconnue determiner apres calcul 1
  21. t2 DW ? ;variable inconnue determiner apres calcul 2
  22. t3 DW ? ;variable inconnue determiner apres calcul 3
  23. t4 DW ? ;variable inconnue determiner apres calcul 4
  24. t5 DW ? ;variable inconnue determiner apres calcul 5
  25. t6 DW ? ;variable inconnue determiner apres calcul 6
  26. ln DW  ? ;Varialbe inconnue determiner par le programme
  27. .code
  28. ;------------------------------------------------
  29. ;- Procedure principale                         -
  30. ;------------------------------------------------
  31. main    proc
  32.   MOV   AX,@data
  33.   MOV   DS,AX
  34. ;------------------------------------------------
  35. ;- Calcul du terme 1                            -
  36. ;------------------------------------------------
  37.   MOV   AX,X   ;place la valeur X dans le registre AX
  38.   MOV   t1,AX   ;Place la valeur X dans t1
  39. ;------------------------------------------------
  40. ;- Calcul du terme 2                            -
  41. ;------------------------------------------------
  42.   MOV   AX,t1
  43.   MUL   X
  44.   DIV   mil
  45.   SUB   DX,DX
  46.   DIV   two
  47.   SUB   DX,DX
  48.   MOV   t2,AX
  49. ;------------------------------------------------
  50. ;- Calcul du terme 3                            -
  51. ;------------------------------------------------
  52.  
  53.   MOV   AX,t2
  54.   MUL   two
  55.   MUL   X
  56.   DIV   mil
  57.   SUB   DX,DX
  58.   DIV   three
  59.   SUB   DX,DX
  60.   MOV   t3,AX
  61. ;------------------------------------------------
  62. ;- Calcul du terme 4                            -
  63. ;------------------------------------------------
  64.   MOV   AX,t3
  65.   MUL   three
  66.   MUL   X
  67.   DIV   mil
  68.   SUB   DX,DX
  69.   DIV   four
  70.   SUB   DX,DX
  71.   MOV   t4,AX
  72. ;------------------------------------------------
  73. ;- Calcul du terme 5                            -
  74. ;------------------------------------------------
  75.  
  76.   MOV   AX,t4
  77.   MUL   four
  78.   MUL   X
  79.   DIV   mil
  80.   SUB   DX,DX
  81.   DIV   five
  82.   SUB   DX,DX
  83.   MOV   t5,AX
  84. ;------------------------------------------------
  85. ;- Calcul du terme 6                            -
  86. ;------------------------------------------------
  87.   MOV   AX,t5
  88.   MUL   five
  89.   MUL   X
  90.   DIV   mil
  91.   SUB   DX,DX
  92.   DIV   six
  93.   SUB   DX,DX
  94.   MOV   t6,AX
  95. ;------------------------------------------------
  96. ;- Calcul du terme final                        -
  97. ;------------------------------------------------
  98.  
  99.   MOV    AX,t1
  100.   SUB    AX,t2
  101.   ADD    AX,t3
  102.   SUB    AX,t4
  103.   ADD    AX,t5
  104.   SUB    AX,t6
  105.   DIV    mil
  106.   SUB    DX,DX
  107.   MOV    ln,AX  ;reponse final
  108. ;------------------------------------------------
  109. ;-      Fin du programme                        -
  110. ;------------------------------------------------
  111.   MOV   AX,04C00h
  112.   INT   21h
  113. main endp
  114. end main


 
J'ai plus de depassement de division, mais je ne sais pas si le resultat est correcte :(


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 15:04:16    

si tu veux je le fais en C et apres je t'envoie le resulat de mon gcc -S  :D


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 30-11-2002 à 15:06:25    

En C je sais aussi le faire ;)
 
Mais maitnenant je me demande pq il m'arrive rien, positif, ou pas? Comment savoir si le resultat est correcte?


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 15:06:58    

Harkonnen a écrit a écrit :

Apprendre l'assembleur est bien pratique... Quand je voyais en IUT les gus en chier pour percuter la notion de pointeur en C, je me marrais bien...
J'avais 2 ans d'asm Motorola dans les dents, et ça m'a permis de comprendre bien des choses !




J'ai commencé par l'ASM 68k (si on exepte le basic) avant de commencer le C. J'avoue aussi que c'est excellent pour assimiler rapidement les notions de bases (pointers &Cie).
Seulement, j'ai oublié tellement de choses dessus!
Ce qui est sur, c'est que je ne recommencerai jamais à me lancer la dedans!


---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 30-11-2002 à 15:16:37    

j'ai fait un td lmi2 et ds view cpu j'ia un beau divide by 0 :(


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 15:16:37   

Reply

Marsh Posté le 30-11-2002 à 16:21:55    

personne ne maitrise ce langage archaique?


Message édité par Le Veilleur le 30-11-2002 à 16:22:03

---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 16:55:32    

pour ma part, assembleur 8086 au graduat il y a une dizaine d'années (purée déjà!).  J'en ai fait un peu plus quand j'ai fait un programme de rip mais c'était du traitement de chaînes.  C'était gai, ça ressemble à une mécanique délicate à mettre au point, j'ai beaucoup aimé, d'autant que le programme a gagné énormément en performances (+400%)
 
Mais question arithmétique... non désolé :/


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 30-11-2002 à 17:48:52    

:cry:  
 
Je vais mettre sur ma copie "Projet impossible : meme ceux de hfr ne savent pas utiliser un tel langage" :whistle:


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 18:05:40    

La version d'un pote
 

Code :
  1. ;
  2. ;
  3. ;
  4. .model small
  5. .stack 100h
  6. ;------------------------------------------------
  7. ;-  Lmi 2 ex 1                                  -
  8. ;-   Calcul du logarithme d'un nombre           -
  9. ;-   ln(x+1) = x- (x*x)/2! + 2(x*x*x)/3!        -
  10. ;-              - 6(x*x*x*x)/4! etc....         -
  11. ;------------------------------------------------
  12. .data
  13. X DW 500 ;variable de Valeur 1000 fois plus gd que
  14. two DW 2 ;variable de valeur 2
  15. three DW 3 ;variable de valeur 3
  16. four DW 4 ;variable de valeur 4
  17. five DW 5 ;variable de valeur 5
  18. six DW 6 ;variable de valeur 6
  19. mil DW 1000 ;variable de valeur 1000
  20. ln DW  ? ;Varialbe inconnue determiner par le programme
  21. .code
  22. ;------------------------------------------------
  23. ;- Procedure principale                         -
  24. ;------------------------------------------------
  25. main    proc
  26.   MOV   AX,@data
  27.   MOV   DS,AX
  28. ;------------------------------------------------
  29. ;- Calcul de x - (x^2)/2!                       -
  30. ;------------------------------------------------
  31.   MOV   AX,X   ;place la valeur X dans le registre AX
  32.   MOV   BX,X   ;Place la valeur X dans le registre BX
  33.   MOV   CX,X   ;place la valeur x dans le refistre CX
  34.   MUL   CX
  35.   DIV   mil
  36.   SUB   DX,DX     ;Remet le registre DX à 0
  37.  
  38.   SUB   BX,AX     ;Le registre BX contient x - (x^2)/2
  39.  
  40.   DIV   two
  41.   SUB   DX,DX
  42. ;------------------------------------------------
  43. ;- Calcul de x - (x^2)/2! + (2*x^3)/3!          -
  44. ;------------------------------------------------
  45.   MUL   two
  46.   MUL   CX
  47.   DIV   mil
  48.   SUB   DX,DX
  49.   DIV   three
  50.   SUB   DX,DX
  51.   ADD   BX,AX     ;Le registre BX contient x - (x^2)/2! + (2*x^3)/3!
  52. ;------------------------------------------------
  53. ;- Calcul de x -(x^2)/2! + (2*x^3)/3! - (6*x^4)/4!
  54. ;------------------------------------------------
  55.  
  56.   MUL   three
  57.   MUL   CX
  58.   DIV   mil
  59.   SUB   DX,DX
  60.  
  61.   DIV   four
  62.   SUB   DX,DX
  63.   SUB   BX,AX     ;Le registre BX contient x - (x^2)/2! + (2*x^3)/3! - (6*x^4)/4!
  64. ;------------------------------------------------
  65. ;- Calcul de  x - (x^2)/2! + (2*x^3)/3! - (6*x^4)/4! + (24*x^5)/5!
  66. ;------------------------------------------------
  67.   MUL   FOUR
  68.   MUL   CX
  69.  
  70.   DIV   mil
  71.   SUB   DX,DX
  72.   DIV   five
  73.   SUB   DX,DX
  74.   ADD   BX,AX    ;Le registre BX contient x - (x^2)/2! + (2*x^3)/3! - (6*x^4)/4! + (24*x^5)/5!
  75. ;------------------------------------------------
  76. ;- Calcul de  x - (x^2)/2! + (2*x^3)/3! - (6*x^4)/4! + (24*x^5)/5! - (120*x^6)/6!
  77. ;------------------------------------------------
  78.  
  79.   MUL   five
  80.   MUL   CX
  81.  
  82.   DIV   mil
  83.   SUB   DX,DX
  84.   DIV   six
  85.   SUB   DX,DX
  86.   SUB   BX,AX     ;Le registre BX contient le resultat final
  87. ;------------------------------------------------
  88. ;- Resultat                                     -
  89. ;------------------------------------------------
  90.    MOV  ln,BX     ;Le resultat est 1000 fois trop grand
  91. ;------------------------------------------------
  92. ;-      Fin du programme                        -
  93. ;------------------------------------------------
  94.   MOV   AX,04C00h
  95.   INT   21h
  96. main endp
  97. end main


 
Mais je comprends pas bien le CX, car cx prend la valeur de x, on multiplie CX par X et ensuite il va se stocker ou cx? Car on en parle plus apres :( Je comprends pas trop ca, le reste du prog je comprends.


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 18:08:42    

si je me rappelle bien mes cours, chaque opération voit son résultat stocké dans DX:AX (comme l'a indiqué Harko plus haut).
 
Au fait c'est l'assembleur 8086 16 bits que tu emploies?  J'assume que tu sais que chaque registre a un rôle générique + un rôle particulier dans certaines opérations?


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 30-11-2002 à 18:09:34    

ben mul ecrit le resultat de l'operaton dans un des registres, mais je sais plus lequel...
 
ax et dx si besoin est je crois


Message édité par lorill le 30-11-2002 à 18:12:26
Reply

Marsh Posté le 30-11-2002 à 18:10:17    

alors deux remarques:
 
1) est-tu bridé au jeu d'instruction du 286 ?
tu peux très bien utiliser des instructions 32 bits pour éviter divers débordements. (pour les remarques ultérieures c'est même chaudement recommandé)
 
2) diviser par 2,4,8, une puissance de 2: 2^N reviens à décaler vers la droite de N rangs (gain de temps et évite des emmerdes)
 
3) tu est (ou tu dois travailler) en virgule fixe:
 
ton X qui peut être entre 0.040=<X=<0.5, est pré-multiplié par 1000 c'est ça ? vue le:
 

Citation :


X DW 500 ;variable de Valeur 1000 fois plus gd que  


 
alors en virgule fixe, vo mieux pré-multiplier par une puissance de 2 ( because remarque 2) )
 
donc mettons que ton WORD (16bits) X soit prémultiplé par 1024, dans une multiplication du style: X²
 
tu auras: X*1024 * X*1024 => X*X * 1024²
 
il te faudra donc ramener ta valeur sous une forme X*X * 1024, en shiftant de 10 bits vers la droite.
 
 

Reply

Marsh Posté le 30-11-2002 à 18:20:28    

Je ne pense pas que l'on soit bridé aux instructions du 286, On nous a rien dit, pour compiler on utilise tasm.
 
Ce que je ne comprends pas c'est ici
 

Code :
  1. MOV   AX,X   ;place la valeur X dans le registre AX
  2.     MOV   BX,X   ;Place la valeur X dans le registre BX
  3.     MOV   CX,X   ;place la valeur x dans le refistre CX
  4.     MUL   CX
  5.  
  6.     DIV   mil
  7.     SUB   DX,DX     ;Remet le registre DX à 0
  8.    
  9.     SUB   BX,AX     ;Le registre BX contient x - (x^2)/2
  10.    
  11.     DIV   two
  12.     SUB   DX,DX


 
On met la valeur de X (cad 500) ds AX -> Ok
On met la valeur de X (cad 500) ds BX -> Ok
On met la valeur de X (cad 500) ds CX -> Ok
Ensuite on multiplie par CX (cad par 500) -> Mais on multiplie quoi par 500 ? AX? BX? CX ?
Car ensuite on disie par 1000, mais que divisis t on? AX je crois.
 
edit:Au fait merci de m'aider :)  :jap: , j'ai encore un ex qui m'attends demain :(


Message édité par Le Veilleur le 30-11-2002 à 18:22:32

---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 18:22:24    

donc pour plus de précision dans ce que je t'ai dit:
je suppose que tu est avec TASM ou un truc du genre:
 
tu rajoutes ".386" dans la zone des .model / .stack.
 
là tu auras accès au jeu d'instruction 32 bits (même si tu est en mode réel, mais je pense pas que tu saches ce que c'est).
 
ax deviens donc EAX, bx EBX etc etc....
 
mul/imul:
 
par exemple:  
 
mul ebx
 
multiplie eax par ebx, donc a 32bits*32bits => ce qui donne 64 bits
 
les 64bits sont stoqués dans EDX:EAX (edx poids fort, eax poids faible)
 
idem:
 
div ebx
 
fait une division 64bits/32bits => 32 bits dans le reste, 32 bits dans le quotient
 
divise symétriquement EDX:EAX par EBX, après EAX contiens le quotient, EDX le reste.

Reply

Marsh Posté le 30-11-2002 à 18:24:31    

j'approuve bjone à 100%, en te suggérant également une petite optimisation :
 
remplace
 
SUB DX,DX
 
par
 
XOR DX,DX
 
quelques cycles de gagné, et tu pourras faire le beau devant ton prof :d


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-11-2002 à 18:24:37    

bon, j'ai retrouvé mon poly
 


usage: mul src
 
realise la multiplication non signée de l'accumulateur (ax, non ?) par src et place le resultat dans l'accumulateur. (...)


 
voila.

Reply

Marsh Posté le 30-11-2002 à 18:25:52    

bjone a écrit a écrit :

donc pour plus de précision dans ce que je t'ai dit:
je suppose que tu est avec TASM ou un truc du genre:
 
tu rajoutes ".386" dans la zone des .model / .stack.
 
là tu auras accès au jeu d'instruction 32 bits (même si tu est en mode réel, mais je pense pas que tu saches ce que c'est).
 
ax deviens donc EAX, bx EBX etc etc....
 
mul/imul:
 
par exemple:  
 
mul ebx
 
multiplie eax par ebx, donc a 32bits*32bits => ce qui donne 64 bits
 
les 64bits sont stoqués dans EDX:EAX (edx poids fort, eax poids faible)
 
idem:
 
div ebx
 
fait une division 64bits/32bits => 32 bits dans le reste, 32 bits dans le quotient
 
divise symétriquement EDX:EAX par EBX, après EAX contiens le quotient, EDX le reste.




Mais je pense pas que je peux faire ca, car on ne l'a pas vu au cours, Je ne pense pas que le prof appréciera :(
 
J'ai l'impression de ne pas comprendre les roles et caracterisques propre a chacun des registres; AX,BX,CX,DX


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 18:28:06    

lorill a écrit a écrit :

bon, j'ai retrouvé mon poly
 


usage: mul src
 
realise la multiplication non signée de l'accumulateur (ax, non ?) par src et place le resultat dans l'accumulateur. (...)


 
voila.




Ca serait donc ca, mais alors pq ne pas faire  
 
MOV AX,X
MUL X
 
Ou encore  
MOV AX
MUL AX
 
On est obligé de prendre CX?


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 18:28:33    

Le Veilleur a écrit a écrit :

 
J'ai l'impression de ne pas comprendre les roles et caracterisques propre a chacun des registres; AX,BX,CX,DX




 
ben en fait c'est surtout savoir ce qui est utilisée par telle opérande. Mais normalement vous l'avez vu en cours, non ?

Reply

Marsh Posté le 30-11-2002 à 18:30:14    

Le Veilleur a écrit a écrit :

 
Ca serait donc ca, mais alors pq ne pas faire  
 
MOV AX,X
MUL X
 
Ou encore  
MOV AX
MUL AX
 
On est obligé de prendre CX?




ben ton mul cx fait en fait ax = ax*cx
donc si tu as deja quelque chose dans ax, tu vas l'ecraser avec ton mov

Reply

Marsh Posté le 30-11-2002 à 18:30:31    

lorill a écrit a écrit :

 
 
ben en fait c'est surtout savoir ce qui est utilisée par telle opérande. Mais normalement vous l'avez vu en cours, non ?




Je ne me souviens plus tres bien ce que je faisais aux cours qd on a vu ca :( On un syllabus mais y a pas grand chose dedans, j'ai acheter le livre de microp app "savoir developper en assembleur" mais ca me semble bizzard ce livre, C'est pas trop.


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 18:32:06    

Le Veilleur a écrit a écrit :

 
Je ne me souviens plus tres bien ce que je faisais aux cours qd on a vu ca :( On un syllabus mais y a pas grand chose dedans, j'ai acheter le livre de microp app "savoir developper en assembleur" mais ca me semble bizzard ce livre, C'est pas trop.




ben microapp c'est un editeur a éviter a tout prix, avec macmillan...

Reply

Marsh Posté le 30-11-2002 à 18:33:57    

le .386 ne marchera qu'avec TASM32.  Et je doute qu'ils l'utilisent.  Les mécanismes inhérents au 80386 ne s'appliquent pas au 8086.  Je pense que c'est un fait exprès et que leur prof s'attend à ce que les élèves exploitent le 8086.  C'est cependant à vérifier avec le prof ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 30-11-2002 à 18:34:16    

exemple typique de calcul de pente d'une ligne à traçer:
 
tu traçes la ligne pas par pas sur le X, à la position [X,Y].
 
imaginons dans eax, tu ayes le delta sur Y, dans ebx le delta sur X (les deux positifs):
 
ça te donne un truc comme ça:
 
shl eax,10   ; on décalle de 10 bits => multiplication par 1024, on a une précision fractionnaire
 
xor edx,edx  ; edx mis à 0 à cause du fait qu'on va faire une division 64bits/32bits
 
div ebx
 
dans eax, on a la pente*1024
 
donc par tour de boucle on va faire:
 
pour chaque X
   temporaire <- Y/1024      ;  == Y>>10 => shr ...,10
   traçer à position X,temporaire
   Y <- Y + pente
fin pour
 
donc grosso modo en asm:
 
sachant que dans eax on a la pente, dans ebx: X (dumoins le delta X)
 
mov edx,eax ; copie de eax dans edx because eax sera notre temporaire
 
xor ecx,ecx ; on désigne comme Y
 
boucle:
  mov eax,ecx ; temp <- Y
  shr eax,10  ; temp <- temp / 1024
  .... traçer à position X,eax
  add ecx,edx , Y <- Y + pente
  dec ebx
  jnz boucle
 
-- ceci pour que tu comprennes bien la virgule fixe


Message édité par bjone le 01-12-2002 à 23:40:12
Reply

Marsh Posté le 30-11-2002 à 18:34:28    

oki pour la multiplication
 

Code :
  1. MOV   AX,X   ;place la valeur X dans le registre AX
  2.     MOV   BX,X   ;Place la valeur X dans le registre BX
  3.     MOV   CX,X   ;place la valeur x dans le refistre CX
  4.     MUL   CX
  5.  
  6.     DIV   mil
  7.     SUB   DX,DX     ;Remet le registre DX à 0
  8.    
  9.     SUB   BX,AX     ;Le registre BX contient x - (x^2)/2
  10.    
  11.     DIV   two
  12.     SUB   DX,DX


 
Donc ax=ax*Cx  , je comprends
Je suppose que div, ca fait ax=ax/mil
mais alors le sub je ne comprends pas, car bx=x et ax=(ax*cx)/mil
 
A moins que le sub place la valeur ds le BX ?
Donc mul ca la placerait ds AX et SUB ds BX?


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 18:35:49    

lorill a écrit a écrit :

 
ben microapp c'est un editeur a éviter a tout prix, avec macmillan...




+1  g un prof qui déconseillait microapp parce qu'il y avait des fautes de traduction, mais plus grave, d'implémentation (dasn un bouquin d'asm en plus).  Et personnellement, je les trouve trop grand public.  C'est peut être leur plus gros défaut.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 30-11-2002 à 18:36:10    

Drasche a écrit a écrit :

le .386 ne marchera qu'avec TASM32.  Et je doute qu'ils l'utilisent.  Les mécanismes inhérents au 80386 ne s'appliquent pas au 8086.  Je pense que c'est un fait exprès et que leur prof s'attend à ce que les élèves exploitent le 8086.  C'est cependant à vérifier avec le prof ;)




 
:non:  
 
je faisais des routines 32 bits en BTS sous BC 3.1 (dos en mode réel)

Reply

Marsh Posté le 30-11-2002 à 18:37:52    

autant pour moi ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 30-11-2002 à 18:38:40    


usage: div src
 
realise la division binaire de l'accumulateur (ax) par src (...)


 


usage: sub dest, src
 
realise la soustraction des deux operandes et stocke le resultat dans dest.
dest = dest - src


 

Reply

Marsh Posté le 30-11-2002 à 18:39:17    

Le Veilleur a écrit a écrit :

oki pour la multiplication
 

Code :
  1. MOV   AX,X   ;place la valeur X dans le registre AX
  2.     MOV   BX,X   ;Place la valeur X dans le registre BX
  3.     MOV   CX,X   ;place la valeur x dans le refistre CX
  4.     MUL   CX
  5.  
  6.     DIV   mil
  7.     SUB   DX,DX     ;Remet le registre DX à 0
  8.    
  9.     SUB   BX,AX     ;Le registre BX contient x - (x^2)/2
  10.    
  11.     DIV   two
  12.     SUB   DX,DX


 
Donc ax=ax*Cx  , je comprends
Je suppose que div, ca fait ax=ax/mil
mais alors le sub je ne comprends pas, car bx=x et ax=(ax*cx)/mil
 
A moins que le sub place la valeur ds le BX ?
Donc mul ca la placerait ds AX et SUB ds BX?




Vous avez une idée pour ca?
Surtout que div par deux encore en dessus, si on l'avait fait avant le SUB ok, mais la on le fait apres :??:


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 18:40:12    

lorill a écrit a écrit :


usage: div src
 
realise la division binaire de l'accumulateur (ax) par src (...)


 


usage: sub dest, src
 
realise la soustraction des deux operandes et stocke le resultat dans dest.
dest = dest - src


 
 




merci, Tu sors ca d'ou? Un prog? du net? Car ca a l'air bien fait.


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 18:41:16    

Le Veilleur a écrit a écrit :

 
merci, Tu sors ca d'ou? Un prog? du net? Car ca a l'air bien fait.




 
nan, un poly fait par des eleves, et effectivement, y'a la description de toutes les instructions, c'est bien pratique. Mais je sais pas si y'a l'equivalent sur le net :/

Reply

Marsh Posté le 30-11-2002 à 18:43:17    

lorill a écrit a écrit :

 
 
nan, un poly fait par des eleves, et effectivement, y'a la description de toutes les instructions, c'est bien pratique. Mais je sais pas si y'a l'equivalent sur le net :/




Tu pourrais me dir le ADD aussi stp


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 30-11-2002 à 18:43:18    

Le Veilleur a écrit a écrit :

oki pour la multiplication
 

Code :
  1. MOV   AX,X   ;place la valeur X dans le registre AX
  2.     MOV   BX,X   ;Place la valeur X dans le registre BX
  3.     MOV   CX,X   ;place la valeur x dans le refistre CX
  4.     MUL   CX
  5.  
  6.     DIV   mil
  7.     SUB   DX,DX     ;Remet le registre DX à 0
  8.    
  9.     SUB   BX,AX     ;Le registre BX contient x - (x^2)/2
  10.    
  11.     DIV   two
  12.     SUB   DX,DX


 
Donc ax=ax*Cx  , je comprends
Je suppose que div, ca fait ax=ax/mil
mais alors le sub je ne comprends pas, car bx=x et ax=(ax*cx)/mil
 
A moins que le sub place la valeur ds le BX ?
Donc mul ca la placerait ds AX et SUB ds BX?




 
 :non:  
 
mul CL, CL étant 8 bits, on a AX = AL * CL
mul CX, CX étant 16 bits, on a DX:AX (32 bits) = AX * CX
mul ECX, ECX étant 32 bits, on EDX:EAX (64 bits) = EAX * ECX
 
idem:
 
div CL, fait AX / CL => AL (quotient), AH (reste)
div CX, fait DX:AX (32bits) / CX => AX (quotient) DX (reste)
div ECX, fait EDX:EAX / ECX => EAX (quotient) EDX (reste)
 
http://www.geocities.com/SiliconVa [...] l1003.html
mul ECX

Reply

Marsh Posté le 30-11-2002 à 18:45:49    

bjone a écrit a écrit :

 
 
 :non:  
 
mul CL, CL étant 8 bits, on a AX = AL * CL
mul CX, CX étant 16 bits, on a DX:AX (32 bits) = AX * CX
mul ECX, ECX étant 32 bits, on EDX:EAX (64 bits) = EAX * ECX
 
idem:
 
div CL, fait AX / CL => AL (quotient), AH (reste)
div CX, fait DX:AX (32bits) / CX => AX (quotient) DX (reste)
div ECX, fait EDX:EAX / ECX => EAX (quotient) EDX (reste)
 
http://www.geocities.com/SiliconVa [...] l1003.html
mul ECX




:jap:
j'imprime tout ca :)


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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