multiplication et overflow

multiplication et overflow - ASM - Programmation

Marsh Posté le 23-01-2006 à 01:11:17    

Alors voilà, je dois faire une calculatrice en assembleur, l'utilisateur peut rentrer 2 entiers nombres compris en 0 et 9999 mais lorsque j'éxecute la multiplication, et que le résultat est supérieur ou égal à 65536 (soit 2^16 bits), j'ai tout naturellement un overflow et je n'arrive pas à résoudre mon problème.
 
 
Merci de votre aide
 
 
P.S.:J'ai remarqué que le résultat de la multiplication est le suivant 65536*DX + AX


Message édité par op-hium le 23-01-2006 à 01:45:52
Reply

Marsh Posté le 23-01-2006 à 01:11:17   

Reply

Marsh Posté le 23-01-2006 à 11:46:27    

en 16bits:
 
mul/imul bx  
 
ça fait:  ax*bx (16bits*16bits) => dx:ax (32bits)
 
en 32bits:
 
mul/imul ebx  
 
ça fait : eax*ebx (32bits*32bits) => edx:eax (64bits)
 
pour transformer un:
mul bx
en:
mul ebx
 
sur un assembleur 16bits, tu rajoutes "db 66h" qui est l'octet de préfixe pour basculer les opérandes en 32bits.
 
donc genre un:
 
db 66h
mul bx
 
fera un:
 
mul ebx.
 
par contre attention à la partie haute de ebx...

Reply

Marsh Posté le 23-01-2006 à 11:47:23    

symétriquement, un:
 
db 66h
mov bx,[tartenpion]
 
fera un:
mov ebx,[tartenpion]

Reply

Marsh Posté le 23-01-2006 à 11:58:38    

je vais voir, mais j'avais déjà essayer de travailler avec les registres EAX, EBX mais étant sous DOS, c'est registre n'existe pas.
Et je continue à chercher une méthode de calcul, quitte à devoir affiche mon résultat digit par digit ou par packet.
Mais je vais tout de même essayer ça merci

Reply

Marsh Posté le 23-01-2006 à 12:52:01    

Citation :

je vais voir, mais j'avais déjà essayer de travailler avec les registres EAX, EBX mais étant sous DOS, c'est registre n'existe pas.


c'est faux sauf sur les 8086 80186 80286 8088 80188
sur les autres processeurs intel ou compatibles ces registres existent et sont employables même sous dos. Assemblé avec tasm, un programme dos 16 bits accepte les registres 32 bits et les opérations nouvelles si on met une directive .386 ou autre en en-tête.
Le processeur n'a pas d'état d'ame sur le système d'exploitation utilisé. La contrainte est le protocole de transaction avec le dit système.

Reply

Marsh Posté le 23-01-2006 à 13:03:32    

op-hium a écrit :

je vais voir, mais j'avais déjà essayer de travailler avec les registres EAX, EBX mais étant sous DOS, c'est registre n'existe pas.
Et je continue à chercher une méthode de calcul, quitte à devoir affiche mon résultat digit par digit ou par packet.
Mais je vais tout de même essayer ça merci


 
oui soit parceque l'assembleur est trop vieux ou que tu n'as pas la directive pour activer les registres et instructions du 386 (cf db__)

Reply

Marsh Posté le 23-01-2006 à 13:13:04    

j'ai donc mis .386 en en-tête et changé une partie de mes AX, BX, ... en EAX, EBX, ... ainsi que mes variables de dw en dd mais maintenant lorsque je rentre un caractère au clavier, le programme plante

Reply

Marsh Posté le 23-01-2006 à 13:17:14    

si il assemble c'est bon signe.
maintenant post le code...

Reply

Marsh Posté le 23-01-2006 à 14:04:15    

je vais mettre le code qui tourne mais qui ne prend pas en compte l'overflow
 

Code :
  1. affichmes macro par
  2. MOV AH, 09H
  3. MOV DX, offset par
  4. INT 21H
  5. MOV AH, 02H
  6. MOV DL, 0AH
  7. INT 21H
  8. endm
  9. CSEG SEGMENT
  10. ASSUME CS:CSEG, DS:CSEG, ES:CSEG
  11. MAIN:
  12. MOV AX,CS
  13.     MOV DS,AX
  14. saisie_nb:
  15.     affichmes prem_nb
  16.  
  17. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  18. ;on convertis une valeur ASCII en un chiffre              ;
  19. ;pour le premier nombre                    ;
  20. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  21. MOV DX, offset val_ascii1
  22. MOV AH, 0Ah
  23. INT 21h
  24. LEA DI, val_ascii1  ;on charge la variable sur laquelle on travaille
  25. INC DI     ;on met le pointeur sur le nombre de caractère contenu (sans le CR)
  26. MOV BX, 0   ;initialisation de BX à 0
  27. MOV BL, [DI]     ;on place dans BX la valeur sur laquelle pointe BI
  28. MOV var1, BX   ;et on met BX dans var pour pouvoir travailler avec par la suite
  29. ADD DI, var1   ;on ajoute le nombre de caractère à DI pour ce placer entre le dernier caractère et le CR
  30. MOV CX, var1   ;on place var dans CX pour faire une boucle
  31. MOV coeff1, 1  ;initialisation du coefficiant
  32. MOV nb1, 0   ;initialisation de la variable de sortie à 0
  33. convertion:
  34. MOV DX, 0
  35. MOV AX, 0
  36. MOV AL, [DI]
  37. ;on compare le code ASCII du caractère traité et celui de 3OH (0) s'il est inférieur
  38. ;c'est que ce n'est pas un chiffre
  39. CMP AL, 30H
  40. JB erreur_saisie
  41. ;on recompare avec 39H (9)
  42. CMP AL, 39H
  43. JA erreur_saisie
  44. DEC DI
  45. SUB AX, 30h
  46. MUL coeff1 ; AX := AX x coeff1
  47. ADD nb1, AX
  48. MOV AX,10
  49. MUL coeff1
  50. MOV coeff1 ,AX
  51. LOOP convertion
  52. CALL newline
  53. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  54. ;on recommence avec le deuxième nombre                                             ;
  55. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  56. affichmes deux_nb
  57. MOV AX, 0
  58. MOV BX, 0
  59. MOV CX, 0
  60. MOV DX, 0
  61. MOV DX, offset val_ascii2
  62. MOV AH, 0Ah
  63. INT 21h
  64. LEA DI, val_ascii2
  65. INC DI
  66. MOV BX, 0
  67. MOV BL, [DI]   
  68. MOV var2, BX
  69. ADD DI, var2
  70. MOV CX, var2
  71. MOV coeff2, 1
  72. MOV nb2, 0
  73. convertion2:
  74. MOV DX, 0
  75. MOV AX, 0
  76. MOV AL, [DI]
  77. CMP AL, 30H
  78. JB erreur_saisie
  79. CMP AL, 39H
  80. JA erreur_saisie
  81. DEC DI
  82. SUB AX, 30h
  83. MUL coeff2
  84. ADD nb2, AX
  85. MOV AX,10
  86. MUL coeff2
  87. MOV coeff2 ,AX
  88. LOOP convertion2
  89. CALL newline
  90. JMP multiplication
  91. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  92. ;on effectue l'addition                                                   ;
  93. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  94. CALL newline
  95. affichmes resadd
  96. MOV AX, nb1
  97. push ax
  98. mov al, 0
  99. call affichage
  100. call newline
  101. pop ax
  102. mov ah, 0
  103. call affichage
  104. jmp fin
  105. ADD AX, nb2
  106. ;affichage du résultat
  107. CALL affichage
  108. CALL newline
  109. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  110. ;on effectue la soustraction                                              ;
  111. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  112. CALL newline
  113. affichmes ressoust
  114. MOV AX, nb1
  115. CMP AX, nb2
  116. JB soust_inv
  117. JA soust_norm
  118. soust_norm:
  119. MOV AX, nb1
  120. SUB AX, nb2
  121. CALL affichage
  122. JMP multiplication
  123. soust_inv:
  124. MOV BX, nb2
  125. SUB BX, nb1
  126. MOV DL, 2DH
  127. MOV AH, 02h
  128. INT 21H
  129. MOV AX, BX
  130. CALL affichage
  131. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  132. ;on effectue la multiplication                                 ;
  133. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  134. multiplication:
  135. CALL newline
  136. CALL newline
  137. affichmes resmult
  138. MOV AX, nb1
  139. MUL nb2
  140. CALL affichage
  141. jmp fin
  142. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  143. ;on effectue la division                                      ;
  144. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  145. CALL newline
  146. CALL newline
  147. CMP nb2, 0    ;si nb2 est égale à 0 alors on met un message d'erreur
  148. JE  div_imp
  149. affichmes resdiv  ;sinon on effectue la division 
  150. MOV DX, 0
  151. MOV CX, 0
  152. division:
  153. MOV AX, nb1
  154. DIV nb2
  155. CALL affichage
  156. CMP DX, 0
  157. JNE virgule
  158. CALL newline
  159. JMP fin
  160. div_imp:
  161. affichmes div_impo
  162. JMP fin
  163. virgule:
  164. MOV reste, DX
  165. MOV DL, 2EH
  166. MOV AH, 02H
  167. INT 21H
  168. MOV CX, 0
  169. MOV DX, 0
  170. MOV multdiv, 10
  171. div_virg:
  172. MOV AX, reste
  173. MUL multdiv
  174. DIV nb2
  175. MOV reste, DX
  176. INC CX
  177. CALL affichage
  178. CMP CX, 2
  179. JE fin
  180. CMP DX, 0
  181. JNE div_virg
  182. MOV AX, DX
  183. CALL affichage
  184. CALL newline
  185. JMP fin
  186. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  187. ;on affiche le contenu de AX en empilant le nombre chiffre par chiffre    ;
  188. ;à partir de la division du résultat                                      ;
  189. ;puis on dépile en affichant le résultat caractère par caractère          ;
  190. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  191. affichage: ; affiche AX sous forme de string
  192. PUSH BX
  193. PUSH CX
  194. PUSH DX
  195. MOV BX, 10
  196. MOV CX, 0
  197. decompose_nb:
  198. MOV DX, 0
  199. DIV BX ; AX := AX div 10
  200. INC CX
  201. PUSH DX ; empile le reste
  202. CMP AX, 0
  203. JNE decompose_nb
  204. affiche_digit:
  205. POP AX
  206. MOV DL, 30h
  207. ADD DL, AL
  208. MOV AH, 02H ; fonction d'affichage
  209. INT 21h
  210. LOOP affiche_digit
  211. POP DX
  212. POP CX
  213. POP BX
  214. RET
  215. newline:
  216. PUSH AX
  217. PUSH DX
  218. MOV DL, 10
  219. MOV AH, 2
  220. INT 21h
  221. MOV DL, 13
  222. MOV AH, 2
  223. INT 21h
  224. POP DX
  225. POP AX
  226. RET
  227. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  228. ;si la personne rentre un caractère dont le code ASCII est inférieur à 30h (0);
  229. ;ou supérieur à 39h (9), on affiche un message est on lui demande de          ;
  230. ;recommencer la saisie                                                     ;
  231. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  232. erreur_saisie:
  233. CALL newline
  234. affichmes erreur
  235. affichmes dmd_entrer
  236. MOV AH, 1H
  237. INT 21H
  238. MOV AH, 0AH
  239. INT 21H
  240. JMP saisie_nb
  241. fin:
  242. MOV AH, 1H
  243. INT 21H
  244. MOV AH,4CH
  245. INT 21H
  246. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  247. ;liste des variables utilisées                                          ;
  248. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  249. prem_nb db "le premier nombre", 24H
  250. deux_nb db "le deuxieme nombre", 24h
  251. resadd db "le resultat de l'addition est", 24H
  252. ressoust db "le resultat de la soustraction est", 24H
  253. resmult db "le resultat de la multiplication est", 24H
  254. resdiv db "le resultat de la division est", 24H
  255. erreur db "la sasie est incorrecte, veuillez n'entrer que des caracteres compris entre 0 et 9", 24H
  256. dmd_entrer db "veuillez taper sur une touche pour recommencer la saisie des nombres", 24H
  257. div_impo db "Il est impossible de faire une division par 0", 24H
  258. val_ascii1 db 5,?,5 dup(?)
  259. var1 dw ?
  260. nb1 dw ?
  261. coeff1 dw ?
  262. val_ascii2 db 5,?,5 dup(?)
  263. var2 dw ?
  264. nb2 dw ?
  265. coeff2 dw ?
  266. reste dw ?
  267. multdiv dw ?
  268. CSEG ENDS
  269. END MAIN


 
Alors docteur, c'est grave ??

Reply

Marsh Posté le 24-01-2006 à 00:36:24    

c'est bon j'ai résolu le problème en affichant caractère par caractère

Reply

Marsh Posté le 24-01-2006 à 00:36:24   

Reply

Marsh Posté le 24-01-2006 à 02:11:43    

encore de l'assembleur des années 20, pitié :cry:


Message édité par Harkonnen le 24-01-2006 à 02:12:13

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

Marsh Posté le 24-01-2006 à 10:30:33    

:D

Reply

Marsh Posté le 24-01-2006 à 12:15:27    

Citation :

encore de l'assembleur des années 20, pitié


en 1920 on programmait déjà ?
Il me semble que le 8086 a du sortir vers 1980
Le masochisme est bien plus vieux et existe pourtant encore
FLNK

Reply

Marsh Posté le 24-01-2006 à 12:21:56    

y'a un truc qui me tabasse : pkoi enseigne t'on encore de l'asm 16bits ? tous les sujets asm ouvert sont en 16bits, c'est quoi ce bins ?

Reply

Marsh Posté le 24-01-2006 à 12:39:00    

bah on fait pas le programme nous
on ne fait que le subir

Reply

Marsh Posté le 24-01-2006 à 12:50:28    

chrisbk a écrit :

y'a un truc qui me tabasse : pkoi enseigne t'on encore de l'asm 16bits ? tous les sujets asm ouvert sont en 16bits, c'est quoi ce bins ?


 
passke les profs en BTS/IUT ont un contenu de cours a forte inertie.... (et l'asm n'étant plus à la mode, ils se prennent pas la tête a revoir le contenu....)
passke ils font ça sous dos pour faire des TP de programmation de hardware...
passke ils ont pas de tasm plus récent pour faire du .386 :D
passke qu'ils connaissent pas OpenWatcom ou DJGPP pour faire du mode protégé sous Dos...
passke sous win et linux ils font que du C/C++ et les IPCS (ce qui est bien déjà)...

Reply

Marsh Posté le 24-01-2006 à 13:28:55    

op-hium > vi je sais bien que t'y es pour rien
 
bjone > ouais mais crotte quoi :o

Reply

Marsh Posté le 24-01-2006 à 14:23:11    

hé oui monde de merde :/

Reply

Sujets relatifs:

Leave a Replay

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