【问题标题】:what does movsbl instruction do? [duplicate]movsbl 指令有什么作用? [复制]
【发布时间】:2011-12-13 05:59:52
【问题描述】:

我在网上搜索过,但我找不到一个清楚的例子来理解这条指令的作用。所以,如果有人能举个例子,那对我很有帮助。

【问题讨论】:

  • 这里列出的汇编指令不止一个……你在处理哪一个? x86?米普斯?每次点击付费?手臂?等等……等等……等等……?
  • 和 MOVZBL 到零扩展:stackoverflow.com/questions/9317922/…
  • movsblmovsx 的 AT&T 语法。不是严格地重复的,而是非常接近以至于它们确实应该被链接。用movsx 代替movzx 阅读链接问题的答案,它也适用于这个问题。

标签: assembly x86


【解决方案1】:

用符号从字节扩展到长字移动。在 Intel 语法中,该指令的助记符是 MOVSX。

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

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

【讨论】:

    【解决方案2】:

    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
    

    对我来说这是一个非常清楚的例子。如需更多示例,请阅读下一页。

    【讨论】:

      【解决方案3】:

      假设您在谈论 x86,MOVSBL 指令将表示 有符号 数的字节(8 位)扩展为 32 位有符号数。剩下的 24 位是 0 或 1,这取决于符号,以便保留二进制补码值。

      意思是,如果你有一个负数,高 24 位将为 1,否则它们将为零。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多