J'ai cherché sur le net, mais je n'ai pas trouvé d'exemple clair pour comprendre ce que fait cette instruction. Donc, si quelqu'un peut donner un exemple à ce sujet, cela me sera très utile.
Déplacer avec le signe s'étendre de l'octet au mot long. Dans la syntaxe Intel, le mnémonique de cette instruction est MOVSX.
Un compilateur C peut utiliser cette instruction lorsqu'une variable de type int8_t
doit être converti en int
, ce qui se produit automatiquement sur l'arithmétique et quelques autres opérations (promotion d'entiers).
Étant donné que cette instruction écrit sur les 32 (ou 64) bits du registre de destination, elle évite les pénalités de performances qui peuvent résulter de l'écriture sur les 8 (ou 16) bits les plus faibles d'un registre. Un ensemble d'instructions similaire permet d'étendre avec zéro bit (MOVZX en syntaxe Intel, MOVZst en syntaxe AT&T (de la taille s à la taille t)).
Le hit Web le plus important pour movsbl
est cette page , et si vous recherchez movsbl
, il indique
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
Cela ressemble à un exemple assez clair pour moi. Pour plus d'exemples, lisez la page suivante.
En supposant que vous parlez de x86, l'instruction MOVSBL étend un octet (8 bits) représentant un nombre signé à un nombre signé 32 bits. Les 24 bits restants sont des zéros ou des uns selon le signe afin que la valeur du complément à deux reste.
Cela signifie que si vous aviez un nombre négatif, les 24 bits supérieurs seront 1, sinon ce seront des zéros.
L'équivalent pour les nombres non signés est MOVZBL, qui s'étend toujours avec 0s.
En supposant qu'il s'agit de la syntaxe d'assemblage AT&T pour IA32 (i386/x86_64), cela signifie MOV avec l'extension de signe de l'octet au long. C'est-à-dire qu'il équivaut à MOVSX r32, r/m8
voir -730 Vol. 2A .