CPU在RSET后的第一条执行指令的地址问题
最近在看Intel的用户手册,其中卷3A 的9.1.4 First Instruction Executed 这一节讲解了第一条指令的执行,但觉得有些模糊:
上面说,CS寄存器分两个部分,可访问的段选择子部分以及隐藏着的基地址部分。然后说加电时选择子部分是F000H,而基地址部分则是FFFF0000。 然后就说第一条指令的起始地址“因而”就是基地址部分加上EIP部分。 这里Intel用了“因而(thus)”这一词。
我想,这里隐含着的意思就是说:
即便是在实模式下面,每当CPU需要访问某个段中的数据时,地址的计算都是从段寄存器的基地址部分来取得基地址的。
每当加载段寄存器的时候cpu就会计算出基地址将其放进段寄存器的基地址部分,方便以后的使用,而不需每次都要计算基地址。
而当刚加电时,基地址部分值并不是根据实地址模式下的计算规则存放的,而是硬性放进基地址部分的,所以当执行第一条指令时,形成了FFFFFFF0的地址,这违反了常规的实地址计算规则。
在这一节里面到处都有这“base address”这一词,我想这应该是指段寄存器的基地址部分吧,毕竟首先提到这个词汇时是作为基地址部分出现的。
可如果按照我这一想法,那麽加载段寄存器的指令应该会修改相应的投影寄存器的内容,可是用户手册卷2A上讲解加载段寄存器指令时又说只有当处于保护模式下面时才会将基地址等额外内容加载进段寄存器的隐藏部分。
很奇怪,说法矛盾了? 另外,虚拟8086模式也属于保护模式啊,那虚拟8086是怎麽处理加载段寄存器的?