2010-09-02 8 views
0
fragment de code

de l'exercice de l'Assemblée (GNU Assembleur, bit Linux 32)problème de déplacement conditionnel

 

.data 

more: 
.asciz "more\n" 

.text 
... 

movl $more, %eax  # this is compiled 
cmova more, %eax  # this is compiled 
cmova $more, %eax  # this is not compiled 

Erreur: suffixe ou opérandes non valide pour `cmova »

Je peux placer l'adresse de chaîne à% eax utilisant movl , mais cmova n'est pas compilé. J'ai besoin que l'opérande source soit $ more et pas plus, pour l'utiliser pour l'impression. Enfin, cette valeur va au registre% ecx de l'appel système Linux 4 (écriture).

Répondre

3

L'assembleur est correct! Les instructions CMOV cc sont plus limitées que MOV: elles ne peuvent déplacer des valeurs de 16/32/64 bits de la mémoire dans un registre, ou d'un registre à un autre. Ils ne prennent pas en charge les opérandes immédiats (ou registre 8 bits).

(Référence: http://www.intel.com/Assets/PDF/manual/253666.pdf - de l'ensemble des manuels disponibles à http://www.intel.com/products/processor/manuals/index.htm.)

+0

Donc, dans ce cas, plus $ est l'opérande immédiat, car il est remplacé par l'assembleur avec adresse de la chaîne? –

+0

Oui. (Eh bien ... techniquement, l'assembleur le remplace par un enregistrement de décalage et de relocalisation - parce que l'adresse finale n'est pas connue jusqu'au moment de la liaison - et ensuite l'éditeur de liens applique la relocalisation plus tard. le code est en cours d'exécution, alors oui, 'movl $ more,% eax' est un déplacement de l'adresse de la chaîne - un opérande immédiat - vers le registre EAX.) Si vous voulez utiliser' cmova' ici, vous aurez faire quelque chose comme 'movl $ more,% edx' suivi de' cmova% edx,% eax'. –

Questions connexes