Resultados extraños con movzwl, %ax y valores negativos
-
26-10-2019 - |
Pregunta
Muy bien, así que estoy tratando con el siguiente fragmento de código:
push %ebp
mov %esp,%ebp
push %ebx
mov 0x8(%ebp),%eax
movzwl %ax,%edx
Entonces esto se comporta como se esperaba cuando se trata de valores positivos. El valor copiado en %EDX es el final de 16 bits de %EAX (o %AX).
Sin embargo, si pones un número negativo, todo comienza a ser extraño y no parece ser comportado como se esperaba.
Por ejemplo, si el valor de %EAX es -67043552, entonces el valor copiado en %EDX es 65312.
Soy bastante nuevo en la asamblea, lo siento si esta es una mala interpretación obvia de mi parte. Cualquier ayuda sería muy apreciada.
Solución
Recuérdalo movzwl
copia solo los bits en %ax
dentro %edx
llenando los altos 16 bits de %edx
con ceros.
Asi que %edx
Siempre termina con un número positivo menor o igual a 65535.
En detalle: -67043552
en hex es fc00ff20
. Entonces, si eso está en %eax
, después %ax
contiene ff20
. Si te mueves eso a %edx
con cero extensión, entonces %edx
obtiene 0000ff20
. Eso es 65312.