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