movsbl指令有什么作用?

时间:2011-10-22 16:55:11

标签: assembly x86

我在网上搜索过,但是我找不到一个明确的例子来理解这个指令的作用。所以,如果有人可以举一个这方面的例子,那对我来说非常有帮助。

4 个答案:

答案 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