为什么" mov%crN,%eax"可以在crN不存在时进行编码?

时间:2014-08-30 04:53:25

标签: x86 x86-64 systems-programming ia-32

英特尔手册第3卷,表示在32E模式下只有CR0,2,3,4 + CR8,而CR1是保留的。但是当我在标题中编译指令时,N可以是任何值&lt; 16.我反汇编obj文件,发现当N <8时,它的编码只是跟随参考。并且当7&lt; N&lt; 16,它的编码与之前相同,但是添加了一个LOCK前缀(将它作为&#34;序列化指令&#34;在MOV cr版本中作为NOTED?)。

为什么编码时没有任何抱怨,这种编码是否合法?这些CR是否真的存在,或者它们只是其他寄存器的别名?

1 个答案:

答案 0 :(得分:0)

予。关于“LOCK”前缀:当前的x86确实没有固定的前缀含义。有一组单字节前缀,它们都具有初始含义(LOCK,REP,CS段等),但后者仅适用于具有直接意义的指令。但是当指令没有这种意义时,还有其他用法。例如,BSR / BSF之前的F3(REPE)分别将它们转换为LZCNT / TZCNT。使用普通的内存读数,相同的REPE转换为XRELEASE。在分支指令是预测提示之前的段前缀2Eh和3Eh(在奔腾4线中使用)。因此,不要将基本前缀角色视为彻底的原则。

II。正在进行的问题:为什么保留的CR应该被编码到你的脑海?我没有看到任何违反此规定的行为。为了类比,为什么不要求IO指令只编码现有端口?您将以与IO或MSR空间相同的方式接受CR空间,这将不再是问题。 :)