Voir le commentaire de MichaelPetch pour savoir comment écrire des macros que vous pouvez utiliser comme opérande source d'une instruction. Vous devez lui dire quel registre pour laisser le résultat.
votre macro imprime le résultat sur stdout ?? Ce n'est pas un shell Unix, c'est le langage d'assemblage. Vous n'obtenez pas les résultats de la substitution de commande var=$(cmd2)
pour capturer stdout, vous les laissez dans un registre!
Votre macro contient uniquement une instruction mul
, vous ne pouvez donc pas calculer le cube d'une entrée arbitraire.
La première fois que votre macro utilise son argument, vous y stockez (mov Num, al
) plutôt que de le charger dans un reg.
Si vous voulez un cube de compilation constante, ne pas utiliser des instructions x86, et ne mettez pas la constante de compilation dans la section de données avec une directive db
. Définissez-le avec un equ
.
Si vous voulez écrire une macro pour placer une séquence d'instructions qui cubes une entrée, il faudra au moins deux arguments: une entrée et une sortie.
Vous pourriez finir par émettre une séquence comme
mov Result, Num
imul Result, Num
imul Result, Num
Où Result
doit être un registre. Ou si vous souhaitez utiliser un mul
non signé, qui n'a pas de formulaire à deux opérandes, demandez à la macro de produire le résultat en eax
. Si la pression du port de chargement est un problème, ou si votre opérande de mémoire utilise un mode d'adressage à deux arguments (qui ne peut pas fusionner sur Intel SnB et plus tard), alors la macro pourrait utiliser un registre de travail donc il suffit de charger une fois. Écrire une macro qui pousse et saute pour enregistrer des regs est une idée terrible. Passez-lui simplement quelques registres de travail comme arguments de macro. Déversez/rechargez-les si nécessaire dans les endroits qui utilisent la macro.
montrez ici ce que vous avez essayé. –
Un: votre macro ne peut pas développer quelque chose qui peut être un opérande 'mov', parce que c'est une séquence entière d'instructions. Ils n'arrivent pas au moment de la compilation! Deux: votre macro imprime le résultat à stdout ?? Ce n'est pas un shell Unix, c'est le langage d'assemblage. Vous n'obtenez pas les résultats de la substitution de commande 'var = $ (cmd2)' pour capturer stdout, vous les laissez dans un registre! Trois: votre macro ne contient qu'une seule instruction 'mul'. Quatre: la première fois que votre macro utilise son argument, vous y stockez ('mov Num, al') plutôt que de le charger dans un reg. –
cela signifie que je dois passer deux arguments dans les paramètres de la macro 1 en entrée et 2 en sortie .. ?? –