Isi*_*ows 6 assembly bit-manipulation
有三个基本转变:
英特尔同时具有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
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
脚注1: 有趣的事实:x86具有第二个未记录的左移操作码,例如d0 /4
,d0 /6
并且都左移1个字节。 Sandpile甚至声称一个是SHL,一个是SAL,但是当前的Intel x86手册仅记录了/4
SAL和SHL 的编码。
尚不清楚原始的8086是否实际上设计为针对同一操作的2个名称使用单独的操作码,或者别名操作码是否始终未记录。无论历史如何,现代的 x86都不再记录单独的操作码。(8条指令共享相同的前导字节,但其/r
区别在于:ROL / ROR,RCL / RCR,SHL / SHR和SAL / SAR。将其他一些非移位指令粘贴到/6
编码中会增加晶体管的成本,并使其出错可能还会花费更多的晶体管,因此,将原始8086设计为具有用于左移的冗余编码是有道理的,唯一的问题是,是否/如何在历史上对其进行记录。
但这与实际问题完全相切:x86的SAL 并不是要询问的保留符号位的偏移。
Intel 80960 shli 指令的行为方式如下。描述中说,\xe2\x80\x9c 如果移出的位与符号位不同,则会产生溢出故障。如果发生溢出,结果的符号与源操作数的符号相同。\xe2\x80\x9d(溢出错误可以被屏蔽。即使没有屏蔽,目标操作数也会被写入结果。 )
\n