2011-10-22 23 views
17

He buscado en Internet, pero no he podido encontrar un ejemplo claro para entender qué hace esta instrucción. Entonces, si alguien puede dar un ejemplo sobre esto, será muy útil para mí.¿Qué hace la instrucción movsbl?

+3

Hay más de una instrucción de ensamblaje establecida ... ¿con cuál te enfrentas? x86? MIPS? PPC? ¿BRAZO? etc ... etc ... etc.? –

+0

Creo que es ia32. – sarslanhan

+1

Y MOVZBL a cero extender: http://stackoverflow.com/questions/9317922/what-does-the-movzbl-instruction-do-in-ia-32-att-syntax?lq=1 –

Respuesta

28

Mover con signo extender desde el byte a la palabra larga. En sintaxis Intel, el mnemónico de esta instrucción es MOVSX.

Un compilador de C puede usar esta instrucción cuando una variable de tipo int8_t debe convertirse a int, lo que ocurre automáticamente en aritmética y en algunas otras operaciones (promoción entera).

Dado que esta instrucción escribe en los 32 (o 64) bits del registro de destino, evita penalizaciones de rendimiento que pueden resultar de escribir solo en los 8 bits (o 16) bajos de un registro. Un conjunto similar de instrucciones permite extender con cero bits (MOVZX en sintaxis Intel, MOVZst en AT & sintaxis T (del tamaño s al tamaño t)).

1

Suponiendo que se trata de AT & T sintaxis de ensamblaje para IA32 (i386/x86_64) significa MOV con Sign-extension de Byte a Long. Es decir, es equivalente a MOVSX r32, r/m8 ver 3-730 Vol. 2A.

14

web Arriba golpe para movsbl es this page, y si la búsqueda de movsbl Dice

MOVSBL and MOVZBL 
* MOVSBL sign-extends a single byte, and copies it into a 
    double-word destination 
* MOVZBL expands a single byte to 32 bits with 24 leading 
    zeros, and copies it into a double-word destination 

Example: 
%eax = 0x12345678 
%edx = 0xAAAABBBB 
MOVB %dh, %al   %eax = 0x123456BB 
MOVSBL %dh, %eax  %eax = 0xFFFFFFBB 
MOVZBL %dh, %eax  %eax = 0x000000BB 

Parece que un ejemplo bastante claro para mí. Para ver más ejemplos, lea la página que viene a continuación.

3

Suponiendo que está hablando de x86, la instrucción MOVSBL amplía un byte (8 bits) que representa un número firmado a un número firmado de 32 bits. Los 24 bits restantes son ceros o unos dependiendo del signo, de modo que el valor de complemento de los dos permanece.

Es decir, si tiene un número negativo, los 24 bits superiores serán 1s, de lo contrario serán ceros.

El equivalente para números sin signo es MOVZBL, que se extiende siempre con 0s.