保留符号的左移有任何有效用法吗?

时间:2019-06-04 08:23:44

标签: assembly bit-manipulation

有三个基本转变:

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

英特尔公司同时拥有salshl,但是它们映射到相同的操作码,大多数其他体系结构似乎只具有三个助记符。

您可以按照保留符号还是不保留符号的方式重新构建网格

  • 逻辑+算术左移:不保留符号。
  • 逻辑右移:不保留符号。
  • 算术右移:保留符号。

但这带来了一种新的可能性,即 保留符号的左移。这样可以保留符号位,但其余部分照常移动。

现在我有几个问题:

  1. 这是任何实际用途吗?
  2. 任何架构都可以实现吗?

编辑:为了阐明这一点,我所说的“保持符号”是这样的,例如左移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手册仅记录了/4的SAL和SHL编码。

目前尚不清楚原始8086是否实际上被设计为针对同一操作的两个名称使用单独的操作码,或者别名操作码是否始终未记录。无论历史如何,现代 x86都不再记录单独的操作码。 (8条指令与/r字段共享同一前导字节,以区分它们:ROL / ROR,RCL / RCR,SHL / SHR和SAL / SAR。将其他一些非移位指令插入/6编码会增加晶体管的成本,而使其出错也可能会增加晶体管的成本,因此,有道理的是,最初的8086设计有用于左移的冗余编码,唯一的问题是历史记录/是否被记录。)

但这与实际问题完全相切:x86的SAL不是要询问的保留符号位的移位。

1 个答案:

答案 0 :(得分:2)

Intel 80960 shli指令的行为是这样的。描述说:“如果移出的位与符号位不同,则会产生溢出故障。如果发生溢出,则结果的符号与src操作数的符号相同。”(可以掩盖溢出错误。即使不对其进行掩盖,也将结果写入目标操作数。)