我在网络上搜索了一下,但是没有找到一个清晰的例子来理解这条指令的作用。所以,如果有人能够给出一个例子,那对我来说将非常有帮助。
将字节扩展为长字。在英特尔语法中,该指令的助记符为MOVSX。
C编译器可能在需要将int8_t
类型的变量转换为int
类型时使用此指令,在算术和一些其他操作(整数提升)上会自动发生。
由于此指令写入目标寄存器的所有32(或64)位,因此它避免了仅写入寄存器低8(或16)位可能导致的性能损失。类似的一组指令允许使用零位进行扩展(在英特尔语法中为MOVZX,在AT&T语法中为MOVZst(从大小s到大小t))。
movsbl
的热门搜索结果是 这个页面,如果你搜索 movsbl
它会说:
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
看起来对我来说是一个相当清晰的例子。要获取更多示例,请阅读下一页。
假设这是IA32(i386 / x86_64)的AT&T汇编语法,它表示从字节到长整型的移动带有符号扩展。也就是说,它等同于 MOVSX r32,r / m8 参见3-730 Vol. 2A。
movsbl
是AT&T语法中的movsx
。虽然不是严格的重复,但它们非常接近,应该链接起来。 读取带有movzx
的链接问题的答案,并在此问题中使用movsx
,它也适用于此问题。 - Peter Cordes