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