2015-11-27 3 views
-1

Comment puis-je trouver le cube de nombre à l'aide de macros dans MASM (modèle plat). J'ai essayé mais je ne peux pas le résoudre.Recherche du cube d'un nombre à l'aide de macros

Voici mon code:

include irvine32.inc 

Cube MACRO Num 
    push ecx  
    push edx 
    ;call readint 
    mov Num,al 
    mov eax,3 
    mov ebx,Num  
    mul ebx  
    call writedec 
    call crlf 
    pop edx  
    pop ecx 
ENDM 

.data 
    var1 BYTE 3 

.code 
main PROC 
    mov eax,Cube(var1) 
    exit 
main ENDP 

END main 
+0

montrez ici ce que vous avez essayé. –

+1

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. –

+0

cela signifie que je dois passer deux arguments dans les paramètres de la macro 1 en entrée et 2 en sortie .. ?? –

Répondre

2
  1. 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.

  2. 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!

  3. Votre macro contient uniquement une instruction mul, vous ne pouvez donc pas calculer le cube d'une entrée arbitraire.

  4. 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 

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.

+1

Avec MASM, il est réellement possible de faire des choses comme 'mov eax, Cube (var1)' même avec des macros multilignes. La clé utilise la directive EXITM pour indiquer quel est l'élément de retour (un registre ou une valeur spécifique).Avec cette information, il peut pré-traiter des choses comme 'mov eax, Cube (var1)' Si votre macro génère une valeur dans _ECX_ et vous souhaitez que le registre de retour de la macro, vous pouvez faire 'EXITM ' –

+0

You ' d finir dans mon exemple avec un tas de code macro qui émet des instructions (qui finissent par placer une valeur dans _ECX_). Ensuite, la macro-expansion convertirait une ligne comme 'mov eax, Cube (var1)' en un paquet de code assembleur suivi de 'mov eax, ecx' –

+0

@MichaelPetch: merci pour la correction. Je n'ai pas beaucoup utilisé les macros dans ASM moi-même, et jamais avec MASM, donc je devinais juste sur ce qu'ils pouvaient faire. >. < –