Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Multiplication signée [ Processeurs / X86 ] (WiebeN)

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é dans : code, résultat, bx, multiplication, imul


Répondre à ce message

Sujets en rapport avec ce message

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 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 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 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 c++ vers asm [ par cricri_b34 ] salut j'ai un code que j'aimerais convertir un ensembleur pour un souci de rapidité. dont voici le code : for (v=0; w{   for (w=0; w  {  & assembleur FPU [ par spiky31 ] Bonjour Est ce que quelqu'un pourrait me dire comment insérer du code asm avec des instructions FPU dans un programme C avec des explications ou un e


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,203 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.