有三个基本转变:
英特尔公司同时拥有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手册仅记录了/4
的SAL和SHL编码。
目前尚不清楚原始8086是否实际上被设计为针对同一操作的两个名称使用单独的操作码,或者别名操作码是否始终未记录。无论历史如何,现代 x86都不再记录单独的操作码。 (8条指令与/r
字段共享同一前导字节,以区分它们:ROL / ROR,RCL / RCR,SHL / SHR和SAL / SAR。将其他一些非移位指令插入/6
编码会增加晶体管的成本,而使其出错也可能会增加晶体管的成本,因此,有道理的是,最初的8086设计有用于左移的冗余编码,唯一的问题是历史记录/是否被记录。)>
但这与实际问题完全相切:x86的SAL不是要询问的保留符号位的移位。
答案 0 :(得分:2)
Intel 80960 shli指令的行为是这样的。描述说:“如果移出的位与符号位不同,则会产生溢出故障。如果发生溢出,则结果的符号与src操作数的符号相同。”(可以掩盖溢出错误。即使不对其进行掩盖,也将结果写入目标操作数。)