9
votes

Mul Instruction ne prend pas en charge une valeur immédiate

J'ai lu quelques didacticiels et exemples, mais je ne peux pas envelopper ma tête autour de la manière dont l'instruction code> mul code> fonctionne. J'ai utilisé ajouter code> et sous code> sans problèmes. Donc, apparemment, cette instruction multiplie son opérande par la valeur dans un registre.

Quel registre (EAX, EBP, ESP, etc.) est multiplié par le premier opérande? Et quel registre est le résultat stocké dans, donc je peux le déplacer à la pile? Désolé, je viens d'apprendre l'assemblée X86. P>

Lorsque j'essaie de compiler cette ligne ... p> xxx pré>

i get, Erreur: suffixe ou opérandes invalides pour 'mul' code>. Quelqu'un peut-il m'aider? P>

    global  main
    main:
    push    ebp
    movl    ebp, esp
    sub     esp, byte +8
    mov     eax, 7
    mul     9
    mov     [esp], eax
    call    _putchar
    xor     eax, eax
    leave
    ret


0 commentaires

6 Réponses :


3
votes

http://siyobik.info/index.php?module=x86&id=210

L'opérande de destination est un implicite Opérande situé dans le registre Al, Axe ou EAX (selon la taille de la opérande); L'opérande source est Situé dans un registre général à usage général ou un emplacement de mémoire

Le résultat est stocké dans le registre AX, Enregistrer la paire DX: AX ou S'inscrire Paire EDX: EAX (selon l'opérande taille), avec les bits de haut ordre du Produit contenu dans le registre AH, DX, ou EDX, respectivement. Si la Les bits de l'ordre élevé du produit sont 0, Les FC et des drapeaux sont effacés; Sinon, les drapeaux sont définis.

dans votre source, il devrait être mul au lieu de Mull


0 commentaires

13
votes

mul ne peut pas utiliser une valeur immédiate comme argument. Vous devez charger '9' dans un registre, dire, xxx

qui multiplierait EAX par ECX et stockerait le produit 64 bits dans EDX: EAX.

Il y a Une bonne référence complète des instructions de montage X86 sur le site Web Intel, voir ici

http://www.intel.com/assets/pdf/manual/253666.pdf

http://www.intel.com/assets/pdf/manual/253667.pdf

mais c'est probablement loin Plus d'informations dont vous avez besoin maintenant.


1 commentaires

L'OP n'utilise pas le résultat élevé de l'EDX. Vous devriez au moins mentionner que x86 a une multiplie immédiate (ajoutée parfois avant 386, donc le code 32 bits peut toujours compter sur elle). imul 9 $,% EAX,% EAX . Ou mieux pour Power-of-2 + 1 Lea (% EAX,% EAX, 8),% EAX .



1
votes

Je vais vous donner un lien vers mon préféré facile à lire, mais complet, référence pour x86: http://www.ousob.com/ng/iapx86/ng1840d.php


1 commentaires

Cela ne répond pas à la question de toute façon. Et les réponses de liaison seules sont découragées



3
votes

Je ne suis pas un expert, mais je pense que votre problème est que mul n'acceptera pas un opérande direct dans votre cas la constante décimale 9 alors essayez de mettre 9 en train de dire inscrire un registre BX comme ceci: < Pré> xxx

Pour répondre à votre question sur mul en général, il ressemble à ceci: xxx

et cela: < / p> xxx

ainsi avec des mots qu'il attend un seul opérande qui devrait être un registre ou un emplacement de mémoire (stocker la valeur à multiplier essentiellement une variable) et la multiplie par AX et Ensuite, en fonction de la durée de la durée du registre / de la mémoire (l'opérande que vous avez donnée) était la stockée dans l'AX ou DX: AX ou EDX: EAX

J'espère que je vous ai aidé-il! < / p>


0 commentaires

0
votes

Comment lire sur le manuel Intel pour voir qu'il n'est pas possible

Téléchargez d'abord le manuel Intel. La page de téléchargement actuelle est la suivante: http: // www.intel.com/content/www/us/fr/processors/architectures-software-developer-Manuals.html Mais juste Google "Manuel Intel X86" comme étant contraignant.

Ce que nous voulons, c'est la référence d'instructions combinées de volume 2 Référence A-Z qui contient toutes les instructions.

Dans ce manuel, trouvez la documentation pour div . Nous voyons que div a les formulaires suivants sous la colonne instruction :

  • div r / m8
  • div r / m16
  • div r / m32
  • div r / m64

    r / mx signifie qu'il peut prendre un registre ou un emplacement de mémoire de taille x.

    Par conséquent, il n'y a pas de formulaire qui prend immx , qui est une valeur immédiate ou littérale.

    Il n'est donc pas possible d'encoder cette instruction au processeur, et maintenant nous savons que la seule façon d'aller est transmettre à travers des registres ou de la mémoire.

    Les registres sont plus rapides, nous les utilisons donc bien sûr si possible.


0 commentaires

5
votes

Si vous regardez mul tableau de format que vous remarquerez que cela n'accepte qu'un seul paramètre de registre. Cependant, tournez-vous à imul et vous verrez qu'il existe de nombreuses formes de celui qui accepte un xxx

de sorte de multiplier EAX par 9, vous pouvez faire comme suit ceci xxx

regarder plus près et vous pouvez également observer que ces versions sont non élargies. En fait, aujourd'hui imul est exclusivement utilisé pour presque toutes les multiplications, car la multiplication non élargissante est identique à la signature et Les valeurs non signées et la multiplication dans les langages de haut niveau sont non élargies (c'est-à-dire les types de type de sortie et des opérandes d'entrée des opérandes de sortie sont les mêmes) à moins que vous n'ayez lancé les opérandes à un type plus large. En conséquence, Les processeurs modernes x86 sont souvent optimisés pour imul et il a aussi beaucoup de Plus de formes que mul


1 commentaires

Dans ce cas de Power-of-2 + 1, Lea EAX, [EAX + EAX * 8] est encore meilleur qu'un imul immédiat. Mais oui, +1, je ne peux pas croire toutes ces réponses suggérant MOV dans un registre lorsque l'OP n'utilise clairement pas le demi-demi-résultat.