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

Isi*_*ows 6 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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


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

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

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

prl*_*prl 2

Intel 80960 shli 指令的行为方式如下。描述中说,\xe2\x80\x9c 如果移出的位与符号位不同,则会产生溢出故障。如果发生溢出,结果的符号与源操作数的符号相同。\xe2\x80\x9d(溢出错误可以被屏蔽。即使没有屏蔽,目标操作数也会被写入结果。 )

\n