2017-03-11 4 views
2

Je suis étudiant, et cette année - première année - nous devons apprendre quelques langages de programmation. L'un d'entre eux est Assembly x86.Est-il possible de "combiner" deux registres?

Je voudrais savoir si je peux "combiner" deux registres, et "les utiliser comme un". J'ai besoin de stocker une clé de 64 bits pour déchiffrer un texte mais le professeur veut que nous utilisions principalement des registres pour notre travail. La clé va 'bouger', le bit le moins significatif sera utilisé pour déchiffrer une lettre du texte, et un bit (résultat d'une opération logique avec des bits dans la clé) sera ajouté à la 'fin' de la clé.

Désolé de poser une question stupide, et pour mon anglais.

+0

Recherchez l'instruction 'shld'. Vous pouvez également utiliser plusieurs registres en même temps en utilisant le drapeau de report. Par exemple, pour ajouter deux paires de registres, utilisez 'add' pour la moitié basse et' adc' pour les moitiés hautes. – fuz

Répondre

0

Pas typique pour les processeurs d'avoir ceci, mais x86 a cette fonctionnalité, al, ah, ax, eax, rax sont "combinés" comme vous l'appelez. Vous pouvez accéder à des parties du registre.

Avec plus/toute instruction utile jeux que vous pouvez masquer et décalage et des parties accès d'un registre ...

0

Dans l'ensemble, vous ne pas vraiment « combiner » registres; ils sont indépendants du stockage, comme des variables indépendantes non liées dans les langages de plus haut niveau. Il y a quelques instructions qui peuvent utiliser certains registres ensemble, mais pour la plupart, ils sont utilisés indépendamment. Cela signifie que vous ne "combinez" pas les registres; vous utilisez simplement les registres ensemble. Donc, si vous avez besoin de copier 64 bits, et vous avez seulement des registres 32 bits, vous venez de copier les deux pièces en même temps:

; Copy both halves of the key, the low part into eax, the high part into edx. 
mov eax, [src] 
mov edx, [src+4] 

; Copy both halves out to memory somewhere. 
mov [dest], eax 
mov [dest+4], edx 

Si vous avez besoin de changer la valeur « plus », vous passez les deux registres en même temps. Il y a deux façons de procéder: Vous pouvez soit utiliser astucieusement les instructions de décalage et de rotation, soit utiliser les instructions spéciales "combinées" shld et shrd.

Let regard sur la façon dont vous souhaitez décaler une clé combinée 64 bits par une position binaire, faire le chemin à l'ancienne:

shl eax, 1 ; Shift eax up one bit, putting its top bit into the carry flag. 
rcl edx, 1 ; Rotate edx up by one bit, bringing in the carry flag at the bottom. 

shr edx, 1 ; Shift edx down by one bit, putting its bottom bit into the carry flag. 
rcr eax, 1 ; Rotate eax down by one bit, bringing in the carry flag at the top. 

Maintenant, regardons comment vous le feriez avec le « nouvelle » instruction shrd ou shld:

shrd edx, eax, 1 ; Consider edx+eax together as a single register, and shift right by one bit. 

shld edx, eax, 1 ; Consider edx+eax together as a single register, and shift left by one bit. 

les instructions shrd et shld sont écrites dans l'ordre de « registre élevé » puis « registre bas ». Notez que bien qu'il n'existe pas d'équivalent 128 bits de shrd et shld, le formulaire multi-instructions peut fonctionner pour autant de bits que nécessaire. Par exemple, si EDX + ECX + EBX + EAX forment un seul registre « grand », vous pouvez les déplacer vers le haut et vers le bas un peu à un moment comme celui-ci:

; Move everything up by one bit. 
shl eax, 1 
rcl ebx, 1 
rcl ecx, 1 
rcl edx, 1 

; Move everything down by one bit. 
shr edx, 1 
rcr ecx, 1 
rcr ebx, 1 
rcr eax, 1 

Il existe des moyens plus efficaces de passer encore plus construit par des tailles encore plus grandes, mais c'est simple à comprendre, et cela fonctionne.