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).
Donc, dans ce cas, plus $ est l'opérande immédiat, car il est remplacé par l'assembleur avec adresse de la chaîne? –
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'. –