为什么8085从00000开始,而8086从FFFF0开始?

时间:2012-04-30 08:08:34

标签: x86-16 microprocessors 8085

我无法理解8085-86中CS:IP生成的物理地址的不同起始地址。这是因为Stack吗?我认为Stack的概念出现在8085之前。请帮忙。感谢。

3 个答案:

答案 0 :(得分:4)

我认为答案在于中断向量表(IVT)。 IVT是在8086处理器中引入的。 8085(其设计基于8080处理器)使用不同的方法来处理中断。在8086/8088上,IVT占用了前1024个字节的内存(256个中断向量,每个包含4个字节)。因此,该区域中不能有任何可执行代码。从80286开始,x86 / x64处理器具有中断描述符表寄存器(ID​​TR),可以对其进行更改,以便软件可以将中断向量表重新定位到处理器地址空间的任何位置,方便使用。

技术上如此:   - 8085没有CS寄存器,其地址空间限制为64KiB   - 上电后,8085上的执行从地址0x0000开始   - x86和x64系列处理器的执行从可寻址内存的最后16个字节开始。因此,在具有20个地址线的16位处理器上,这将是线性地址0xFFFF0。在32位处理器上,它的地址是0xFFFFFFF0,而在64位处理器上,它是0xFFFFFFFFFFFFFFF0。系统ROM必须连接到存储器总线,以便响应这些地址。

查看Intel processor manuals以获取官方解释。

答案 1 :(得分:3)

我可以想到有三个原因可以将特定值用于加电IP:

  1. 惯例 - 同一家族/品牌中的其他处理器使用相同的位置,他们希望给客户一种熟悉感
  2. 兼容性
  3. 某些区域因某些目的而受到限制或增强。例如,6502具有特殊的更快的指令,用于访问从0x00到0xff的前256个字节的内存。在那个CPU上,让CPU从其他地方启动是有意义的。 (但我不认为8086特别对待任何记忆区域。)
  4. 除了兼容性和约定问题之外,指令指针在处理器上电时获得的值在很大程度上是任意的。对于大多数模型而言,IP最接近其地址空间的顶部(有足够的空间用于远程JMP调用以使其到达真实初始化代码所在的位置)或最低位(即0)。

    wikipedia articles指出8086的设计使得以前处理器的汇编源代码很容易转换以与8086一起工作,但就是这样。除此之外,没有尝试使其与以前的型号兼容。

答案 2 :(得分:0)

1)在8085中,复位后pc的值为0000h。因此,唤醒程序应写在0000h位置,不能保持为空。

2)在8086中,重置CS& lP是FFFFH& 0000h和所以20位物理地址将是FFFF0 + 0000 = FFFF0H。它不应该是空的。唤醒程序(代码)总是在ROM中,ROM应该最后接口以覆盖FFFF0H。