begin process at 2012 05 25 11:35:04
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Processeurs

 > 

X86

 > 

Multiplication signée


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Multiplication signée

samedi 22 novembre 2008 à 20:19:02 | Multiplication signée

WiebeN

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 :
[code]
  name "imul"

  org 100h

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

  ret
[/code]
D'après un cours trouvé sur le net :
"IMUL Source :
  • Si Source est un octet : AL est multiplié par Source et le résultat est placé dans AX"

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 :
[code]
name "mul"

org 100h

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

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

Merci à vous.

lundi 24 novembre 2008 à 07:05:25 | Re : Multiplication signée

Forthman

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
lundi 24 novembre 2008 à 10:49:51 | Re : Multiplication signée

WiebeN

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 ?
lundi 24 novembre 2008 à 20:27:11 | Re : Multiplication signée

Forthman

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
mardi 25 novembre 2008 à 13:07:05 | Re : Multiplication signée

WiebeN

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 :)


Cette discussion est classée dans : code, résultat, bx, multiplication, imul


Répondre à ce message

Sujets en rapport avec ce message

Récupération des flags du processeur [ par Oeil_de_taupe ] Bonjour,J'ai essayé, après avoir lu beaucoup de théorie sur l'assembleur sur X86, de faire un programme qui utilise les flags d'information du process rs232 [ par TRAX44 ] salut,tout premièrement je sais qu'il ya des exemples sur le site!mais mon problème est autre je tiens à comprendre pourquoi mon code ne fonctionne pa multiplication et overflow [ par piopium ] 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 correction d'un code [ par marooh ] bonjour,j'ai écrit un code assembleur qui permet de comparer deux tableaux,ce code je veux l'inserer dans un code c. si vous pouvez bien me le corrige Modifer le vecteur d'interruptions [ par vecchio56 ] Bonjour J'essaie de refaire la source http://www.cppfrance.com/code.aspx?ID=33558 en assembleur (ca consiste à modifier la routine de l'interruption 0 base pointer [ par anonyme_man_in_this_world ] salut !! je voudrais faire une compilation separee qui va me permetre de faire du code C et asm dans des fichiers differents .mes questions sont : code RC5 68hc908 [ par ordinatan ] Bonjour a tous je vous appel a l'aide car j'ai un petit souci de programation. Il ce trouve que j'aimerais recuperer le code rc5 (classique) d'une tel Est un pangramme ? [ par Guetux ] Bonjour, J'aimerai réaliser un programme qui vérifie si une chaine de caractère contient toutes les lettres de l'alphabet. (Les lettres peuvent êtres


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,983 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales