80386启动后执行的第一条指令是0xfffffff0还是0xffff0?
匿名2023/07/31 19:52:01提问
    2018lab1student
317

按照我的理解,8086取指地址始终是(cs<<4)+ip,cs初始化为0xf000,ip初始化为0xfff0,故执行的第一条指令是0xffff0;80386取指地址是base+eip,base是隐藏寄存器,初始化为0xffff0000,eip初始化为0xfff0,故执行的第一条指令是0xfffffff0。

https://chyyuu.gitbooks.io/ucore_os_docs/content/lab1/lab1_5_appendix.html 中,“intel资料的说明”部分称第一条指令是0xfffffff0,而“单步调试和查看BIOS代码”部分称第一条指令是0xffff0,不一致,所以我怀疑“单步调试和查看BIOS代码”部分有错。此外,我使用gdb查看第一条指令地址时,gdb误认为该指令为0xfff0,即等于eip(已set arch i8086),与上面两种情况均不符。所以我进一步怀疑,若按“单步调试和查看BIOS代码”一节操作,实际上无法得出正确的指令地址。

我进一步观察发现,0xffff0和0xfffffff0实际上映射到的是BIOS中同一段指令,所以不管指令地址是上述哪种情况,都可以正常运行,但这也导致我更无法区分事实上执行的是什么地址处的指令。此外,既然0xffff0和0xfffffff0映射到的是同一个位置,80386为什么还要采用与8086不同的第一条指令地址,即为什么80386不沿用0xffff0?

回答(3
    推荐问答
      Simple Empty
      暂无数据