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é 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> i get, ajouter code> et
sous code> sans problèmes. Donc, apparemment, cette instruction multiplie son opérande par la valeur dans un registre.
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
6 Réponses :
http://siyobik.info/index.php?module=x86&id=210 p>
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 p>
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. P> blockQuote>
dans votre source, il devrait être
mul code> au lieu de
Mull code> p>
mul ne peut pas utiliser une valeur immédiate comme argument. Vous devez charger '9' dans un registre, dire, qui multiplierait EAX par ECX et stockerait le produit 64 bits dans EDX: EAX. P> Il y a Une bonne référence complète des instructions de montage X86 sur le site Web Intel, voir ici P> http://www.intel.com/assets/pdf/manual/253666.pdf P> http://www.intel.com/assets/pdf/manual/253667.pdf p> mais c'est probablement loin Plus d'informations dont vous avez besoin maintenant. P> p>
L'OP n'utilise pas le résultat élevé de l'EDX. Vous devriez au moins mentionner i> 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 code>. Ou mieux pour Power-of-2 + 1
Lea (% EAX,% EAX, 8),% EAX code>.
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 p>
Cela ne répond pas à la question de toute façon. Et les réponses de liaison seules sont découragées
Je ne suis pas un expert, mais je pense que votre problème est que Pour répondre à votre question sur et cela: < / p> 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 P> J'espère que je vous ai aidé-il! P> < / p> mul code> 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 pré>
mul code> en général, il ressemble à ceci: p>
Comment lire sur le manuel Intel pour voir qu'il n'est pas possible fort> p>
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. P>
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. P>
Dans ce manuel, trouvez la documentation pour Par conséquent, il n'y a pas de formulaire qui prend 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. P>
Les registres sont plus rapides, nous les utilisons donc bien sûr si possible. P> div code>. Nous voyons que
div code> a les formulaires suivants sous la colonne em> instruction em>: p>
div r / m8 code> li>
div r / m16 code> li>
div r / m32 code> li>
div r / m64 code> li>
ul>
r / mx code> signifie qu'il peut prendre un registre ou un emplacement de mémoire de taille x. p>
immx code>, qui est une valeur immédiate ou littérale. p>
Si vous regardez de sorte de multiplier EAX par 9, vous pouvez faire comme suit ceci p> regarder plus près et vous pouvez également observer que ces versions sont non élargies. En fait, aujourd'hui mul code>
tableau de format que vous remarquerez que cela n'accepte qu'un seul paramètre de registre. Cependant, tournez-vous à imul code>
et vous verrez qu'il existe de nombreuses formes de celui qui accepte un imul code> 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 code>
et il a aussi beaucoup de Plus de formes que mul code> p> p>
Dans ce cas de Power-of-2 + 1, Lea EAX, [EAX + EAX * 8] code> est encore meilleur qu'un imul immédiat. Mais oui, +1, je ne peux pas croire toutes ces réponses suggérant
MOV code> dans un registre lorsque l'OP n'utilise clairement pas le demi-demi-résultat.