我在网上搜索过,但是我找不到一个明确的例子来理解这个指令的作用。所以,如果有人可以举一个这方面的例子,那对我来说非常有帮助。
答案 0 :(得分:28)
随符号移动从字节扩展到长字。在Intel语法中,该指令的助记符是MOVSX。
当int8_t
类型的变量需要转换为int
时,C编译器可以使用此指令,这会在算术和其他一些操作(整数提升)上自动发生。
因为该指令写入目标寄存器的所有32位(或64位),所以它避免了仅写入寄存器的低8位(或16位)可能导致的性能损失。一组类似的指令允许以零位扩展(英特尔语法中的MOVZX,AT& T语法中的MOVZst(从大小s到大小为t))。
答案 1 :(得分:14)
movsbl
的热门网络热门评论为this page,如果您搜索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
对我来说,这是一个非常明显的例子。有关更多示例,请阅读下一页。
答案 2 :(得分:3)
假设您正在讨论x86,MOVSBL指令将一个字节(8位)扩展为32位有符号数字,表示带符号数字。其余24位为0或1,具体取决于符号,以便保留2的补码值。
意思是,如果您有一个负数,则高24位将为1,否则它们将为零。
无符号数的等价物是MOVZBL,它总是以0s延伸。
答案 3 :(得分:1)
假设这是IA32(i386 / x86_64)的AT& T汇编语法,则意味着MOV具有从Byte到Long的Sign-extension。这相当于MOVSX r32, r/m8
,请参阅3-730 Vol. 2A。