Assembly movsbl指令做什么?

Assembly movsbl指令做什么?,assembly,x86,Assembly,X86,我已经在网上搜索过了,但是我找不到一个清楚的例子来理解这个指令的作用。因此,如果有人能给出一个关于这方面的例子,这将对我非常有帮助。假设这是IA32(i386/x86_64)的AT&T汇编语法,它意味着符号扩展从字节到长的MOV。也就是说,它相当于MOVSX r32,r/m8请参见。将符号从字节扩展到长单词。在英特尔语法中,此指令的助记符是MOVSX 当类型为int8\t的变量需要转换为int时,C编译器可以使用此指令,这会在算术和一些其他操作(整数提升)中自动发生 由于此指令写入目标寄存器的所

我已经在网上搜索过了,但是我找不到一个清楚的例子来理解这个指令的作用。因此,如果有人能给出一个关于这方面的例子,这将对我非常有帮助。

假设这是IA32(i386/x86_64)的AT&T汇编语法,它意味着符号扩展从字节到长的MOV。也就是说,它相当于MOVSX r32,r/m8请参见。

将符号从字节扩展到长单词。在英特尔语法中,此指令的助记符是MOVSX

当类型为
int8\t
的变量需要转换为
int
时,C编译器可以使用此指令,这会在算术和一些其他操作(整数提升)中自动发生


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

movsblis的热门网页,如果搜索
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

在我看来,这是一个很清楚的例子。有关更多示例,请阅读下一页。

假设您谈论的是x86,MOVSBL指令将表示有符号数的字节(8位)扩展为32位有符号数。剩余的24位是0或1,这取决于符号,因此两位的补码值保持不变

也就是说,如果你有一个负数,上面的24位将是1,否则它们将是零


无符号数的等价物是MOVZBL,它总是以0扩展。

这里设置了不止一条汇编指令。。。你在对付哪一个?x86?MIPS?PPC?手臂?等等等等,MOVZBL到零扩展:
movsbl
是AT&T的语法。严格来说,这不是一个复制品,但距离如此之近,以至于它们真的应该链接起来。用
movsx
代替
movzx
阅读链接问题的答案,它也适用于此问题。