2011-09-06 14 views
5

Muy bien, así que estoy tratando con el siguiente fragmento de código:resultados extraños con movzwl, hacha% y los valores negativos

push %ebp 
mov %esp,%ebp 
push %ebx 
mov 0x8(%ebp),%eax 
movzwl %ax,%edx 

Así que este se comporta como se esperaba cuando se trata de valores positivos. El valor copiado en% edx es los últimos 16 bits de% eax (o% ax).

Sin embargo, si ingresas un número negativo, todo comienza a ser raro y no parece comportarse como se esperaba.

Por ejemplo, si el valor de% eax es -67043552, entonces el valor copiado en% EDX es 65312.

Soy bastante nuevo en el montaje, lo siento si esto es una mala interpretación obvia de mi parte. Cualquier ayuda sería muy apreciada.

+0

['movswl'] (http://www.felixcloutier.com/x86/MOVSX:MOVSXD.html) está disponible cuando desea firmar-ampliar el valor firmado de un complemento de 2 en lugar de extender cero un valor binario sin signo. (Consulte también la [wiki de la etiqueta x86] (http://stackoverflow.com/tags/x86/info). –

+0

Además, si imprimiera sus números como hexadecimal, sería mucho menos confuso/más obvio lo que está sucediendo. –

+0

Además, a menos que realmente necesite el valor completo en '% eax', debe' movzwl 0x8 (% ebp),% edx' directamente en lugar de perder una instrucción haciéndolo por separado. Las CPU de Intel pueden manejar 'movzx' /' movsx' como solo una carga uop, sin necesidad de ALU. –

Respuesta

16

Recuerde que movzwl copia solo los bits en %ax en %edx completando los 16 bits altos de %edx con ceros.

Así %edx siempre termina con un número positivo menor o igual a 65535.

En detalle: -67043552 en hexadecimal es fc00ff20. Entonces, si está en %eax, entonces %ax contiene ff20. Si lo mueve a %edx con extensión cero, entonces %edx obtiene 0000ff20. Eso es 65312.

Cuestiones relacionadas