2011-12-20 8 views
6

Digamos que quiero poner dos registros de 32 bits EAX como palabra baja de 32 bits y EDX como palabra de 32 bits alta en RAX. tengo encontrar una manera:¿Cómo mover dos registros de 32 bits a uno de 64 bits?

shl rdx, 32 
    or rax, rdx 

Este método funciona sólo si estamos seguros de que los bits de 32 a 61 de RAX son 0. Si no estamos Shure que, de lo que hay que limpiar primero la palabra alta de 32 bits , como:

mov eax, eax  //This instruction should clear the high 32 bit word of RAX 

¿Es esta la manera más corta?

¿Hay alguna instrucción asm x86-64 que realice esta operación?

+1

AFAIK no hay nada más corto. Si el registro de destino es un regsiter xmm, puede usar dos instrucciones 'pinsd' y evitar las instrucciones de liberación. – hirschhornsalz

+0

@drhirsch: Revisé casi toda la documentación de Intel y no encontré nada útil. :) –

+0

Sí, es posible que pueda ahorrar un poco de espacio con un "xor eax, eax" para borrarlo, pero eso parece tan corto como puede ser. –

Respuesta

12

Tal vez esto es un poco mejor:

shl  rax,32 
shrd rax,rdx,32 

no asume que los altos dwords son cero.

+1

Esa era la combinación que estaba buscando. Sabía que tenía que ser un 'shrd' o' shld' – hirschhornsalz

Cuestiones relacionadas