Multiplication signée

WiebeN Messages postés 3 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 25 novembre 2008 - 22 nov. 2008 à 20:19
WiebeN Messages postés 3 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 25 novembre 2008 - 25 nov. 2008 à 13:07
Bonjour,
Je commence tout juste l'assembleur en cours. Je programme avec EMU8086 (émulateur pour processeur 8086) via Windows XP.

Mon problème est le suivant : j'aimerais faire une multiplication signée en donnant comme paramètres des nombres binaires cependant je n'obtiens pas le résultat voulu.

Prenons en exemple l'opération 15 * (-20) .

1) Je traduis en binaire :
 *15 donne 01111
 *(-20) en complément à 2: 101100
   +20 est codé 010100
   + le complément à 1 donne 101011
   + en ajoutant 1 on obtient 101100
2)
Mon code ASM donne donc :
  name "imul"

  org 100h

  mov al, 01111b
  mov bx, 101100b
  imul bx  

  ret

D'après un cours trouvé sur le net :
"IMUL Source :



<li>
Si Source est un octet : AL
est multiplié par Source et le résultat est
placé dans AX"

</li>Je devrais donc trouver le résultat -300 dans AX soit 12C et le FLAG SF à 1 ( si j'ai bien compris le fonctionnement de IMUL et le principe de SF)

Pourtant je trouve 294 dans AX ce qui veut dire que ce n'est pas -20 qui a été multiplié mais 44. Comment faire alors pour donner -20 je ne comprends pas bien... Notre professeur nous a pourtant dit qu'il fallait utilisé le complément à 2 !

De plus si je fais :
name "mul"

org 100h

mov al,15d
mov bx,-20d
imul bx  

ret

J'obtiens un résultat encore plus extravagant... Pourriez vous me dire où je me plante?

Merci à vous.

4 réponses

Forthman Messages postés 23 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 9 janvier 2014
24 nov. 2008 à 07:05
Bonjour,

Tu as fait 2 erreurs.

La première : 20 est codé sur 8 bits donc 00010100 et -20 donne 11101100b
La seconde : tu utilises BX qui est un registre 16 bits donc la multiplication porte sur AX avec un contenu de AH inconnu

Je pense que tu vas pouvoir corriger ton code tout seul ;)

a+ François
0
WiebeN Messages postés 3 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 25 novembre 2008
24 nov. 2008 à 10:49
Merci pour ta réponse, j'en déduis donc que ce code est juste :

name "imul"

org 100h

mov ax, 00001111b
mov bx, 11101100b
imul bx

ret

J'obtiens dans AX 0DD4 .Le flag SF est toujours à 0. En quoi DD4 représente t-il -300 ?
0
Forthman Messages postés 23 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 9 janvier 2014
24 nov. 2008 à 20:27
Euhhh... non

AX et BX sont des registres 16 bits alors que tu utilises des valeurs 8 bits

Il ne faut pas mélanger les deux

Ou alors tu fais le calcul en 8 bits avec :

mov al, 00001111b
mov bl, 11101100b
imul bl

Ou alors tu fais le calcul en 16 bits :

mov ax, 0000000000001111b
mov bx, 1111111111101100b
imul bx

dans le deuxième car, le résultat sera dans DX:AX mais comme ce dernier tient sur 16 bits, tu peux te contenter
de lire le résultat dans AX

mais au fait, pourquoi écrire tes valeurs en binaire ? (ca fait un peu long quand-même )

a+ François
0
WiebeN Messages postés 3 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 25 novembre 2008
25 nov. 2008 à 13:07
Ok, merci. Celà me donne bien FED4 qui retransmis en binaire est bien 300 en complément à 2.

C'était juste un petit exercice de fin de cours d'ASM que j'avais, je n'aime pas passer un exercice (surtout d'apparence si simple) alors que je ne l'ai pas réussi :p

Encore merci pour ton aide :)
0
Rejoignez-nous