2017-01-24 1 views
0

I have% ecx contenant le nombre de places que je veux la valeur de% esi être décalée vers la gauche, mais à ma connaissance la source de SHL doit être une valeur immédiate.Shifting Bits par valeur dans le registre

Quelqu'un peut-il me aider à comprendre comment je m'y prendrais décalant la valeur de% ecx? J'ai regardé autour et j'ai vu des gens recommander l'utilisation du registre CL. Mais y a-t-il une alternative?

Merci.

Répondre

0

L'architecture 80386 fournit une instruction de décalage à gauche avec la quantité de décalage dans %cl qui est masquée avec 31 pour les quarts de DWORD 15 pour les changements de mots, etc. On notera que le registre %cl est le plus bas 8 bits du registre %ecx:

0  8  16    32        64 
+---------------------------------------------------------------+ 
| rcx               | 
+-------------------------------+-------------------------------+ 
| ecx       | 
+---------------+---------------+ 
| cx   | 
+-------+-------+ 
| cl | ch | 
+-------+-------+ 

par conséquent, shll %cl,%esi fait déjà ce que vous attendez et déplace le contenu de %esi par le nombre d'unités spécifié dans %ecx comme les bits élevés ne compte pas vraiment de toute façon (la quantité de décalage est masqué avec 31 avant de passer) .

+1

... ou masquée par 63 pour les registres 64 bits – Anty

+0

Les bits élevés peuvent en fait la matière pour le programme, qui doit être prise au cas une attention particulière à zéro le résultat. Vous pourriez vous attendre à ce que '1 << 33' soit' 0' et non '2'. – Jester

+0

@Jester C'est correct. Cependant, puisque Shll masquera l'opérande de décalage avec 31, peu importe si des bits élevés sont définis dans ecx car ils sont masqués de toute façon. – fuz