assembly - 保留符号的左移是否有任何有效用途?

标签 assembly bit-manipulation

有三个基本的转变:

  • 逻辑左移:完全忽略符号位。
  • 逻辑右移:如果移位 > 0,则清除符号位。
  • 算术左移:与逻辑左移相同。
  • 算术右移:保留最高位。

  • Intel 有 salshl ,但它们映射到相同的操作码,大多数其他架构似乎只有三个助记符。

    您可以根据符号保留与不保留来重铸网格:
  • 逻辑+算术左移:不保留符号。
  • 逻辑右移:不保留符号。
  • 算术右移:符号保留。

  • 但这产生了一种新的可能性,即保留符号的左移。这将具有保留符号位的行为,但正常移动其余部分。

    现在我有几个问题:
  • 这在现实世界中有用吗?
  • 有没有架构实现这个?

  • 编辑: 为了澄清,我所说的“符号保留”是这样的,例如左移 1 和位宽 8:
    Not sign-preserving:
    S A B C D E F G
     / / / / / / /
    A B C D E F G 0
    
    Sign-preserving:
    S A B C D E F G
    |  / / / / / /
    S B C D E F G 0
    

    希望这可以帮助!

    脚注 1: 有趣的事实:x86 有第二个未记录的左移操作码,例如d0 /4d0 /6 都是左移 1 个字节。 Sandpile even claims 一个是 SHL,一个是 SAL,但是当前的 Intel x86 手册只记录了 SAL 和 SHL 的 /4 编码。

    目前尚不清楚原始 8086 是否实际上旨在为同一操作的 2 个名称使用单独的操作码,或者别名操作码是否始终未记录。无论历史如何,现代 x86 不再记录单独的操作码。 (8 条指令与 /r 字段共享相同的前导字节以区分它们:ROL/ROR、RCL/RCR、SHL/SHR 和 SAL/SAR。将一些其他非移位指令粘贴到 /6 编码中会消耗晶体管,并使它的故障可能还会花费更多的晶体管,因此原始 8086 设计为具有用于左移的冗余编码是有道理的,唯一的问题是它是否/如何在历史上记录。)

    但这与实际问题完全无关:x86 的 SAL 不是所问的符号位保留移位。

    最佳答案

    Intel 80960 shli 指令就是这样运行的。描述说,“如果移出的位与符号位不同,则会产生溢出故障。如果发生溢出,结果的符号与 src 操作数的符号相同。” (可以屏蔽溢出故障。即使没有屏蔽,目标操作数也会写入结果。)

    关于assembly - 保留符号的左移是否有任何有效用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56440020/

    相关文章:

    c++ - unsigned int 到 unsigned long long 定义明确吗?

    video - 中断 10h

    c - 将 4 位数字从汇编发送到 C,以在 LCD 上显示为 ASCII 字符

    c - 汇编相当于函数指针数组?

    javascript - Chip8 仿真器上的碰撞检测

    C# - 如何以某种方式使用枚举标志

    assembly - 十六进制中的NULL是什么

    java - Java 中签署扩展任意长度位模式的最有效方法是什么?

    c - 这 3 行 C 代码到底做了什么?

    c - 在 C 中使用未声明的标识符 'a'