movsbl指令是用于将一个有符号字节转换为有符号长整型的指令。

23

我在网络上搜索了一下,但是没有找到一个清晰的例子来理解这条指令的作用。所以,如果有人能够给出一个例子,那对我来说将非常有帮助。


3
有不止一个汇编指令集存在...你正在处理哪一个?x86?MIPS?PPC?ARM?等等...等等...等等...? - Marc B
1
而MOVZBL则是用于零扩展:https://dev59.com/_Gox5IYBdhLWcg3wQSOp?lq=1 - Ciro Santilli OurBigBook.com
movsbl是AT&T语法中的movsx。虽然不是严格的重复,但它们非常接近,应该链接起来。 读取带有movzx的链接问题的答案,并在此问题中使用movsx,它也适用于此问题。 - Peter Cordes
4个回答

30

将字节扩展为长字。在英特尔语法中,该指令的助记符为MOVSX。

C编译器可能在需要将int8_t类型的变量转换为int类型时使用此指令,在算术和一些其他操作(整数提升)上会自动发生。

由于此指令写入目标寄存器的所有32(或64)位,因此它避免了仅写入寄存器低8(或16)位可能导致的性能损失。类似的一组指令允许使用零位进行扩展(在英特尔语法中为MOVZX,在AT&T语法中为MOVZst(从大小s到大小t))。


18

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

看起来对我来说是一个相当清晰的例子。要获取更多示例,请阅读下一页。


4
假设你所说的是x86,MOVSBL指令将代表一个有符号数的字节(8位)扩展为32位有符号数。剩余的24位是0或1,具体取决于符号,以保持二进制补码值不变。
也就是说,如果你有一个负数,高24位将是1,否则它们将是零。
对于无符号数,等价指令是MOVZBL,它总是用0进行扩展。

1

假设这是IA32(i386 / x86_64)的AT&T汇编语法,它表示从字节到长整型的移动带有符号扩展。也就是说,它等同于 MOVSX r32,r / m8 参见3-730 Vol. 2A


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接