有三个基本的转变:
Intel 有
sal
和 shl
,但它们映射到相同的操作码,大多数其他架构似乎只有三个助记符。您可以根据符号保留与不保留来重铸网格:
但这产生了一种新的可能性,即保留符号的左移。这将具有保留符号位的行为,但正常移动其余部分。
现在我有几个问题:
编辑: 为了澄清,我所说的“符号保留”是这样的,例如左移 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 /4
和 d0 /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/