2

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

4

3 回答 3

4

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

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

查看英特尔处理器手册以获取官方解释。

于 2012-10-05T06:32:29.913 回答
3

有 3 个原因我可以认为可以将特定值用于 powerup IP:

  1. 约定 - 同一家族/品牌中的其他处理器使用相同的位置,并且他们希望给他们的客户一种熟悉感
  2. 兼容性
  3. 某些区域因某些目的而受到限制或增强。例如,6502具有特殊的更快指令,用于访问从 0x00 到 0xff 的前 256 个内存字节。在那个 CPU 上,让 CPU 在其他地方启动是有意义的。(但我不认为 8086 会特别对待任何内存区域。)

撇开兼容性和约定问题不谈,处理器启动时指令指针获得的值在很大程度上是任意的。对于大多数模型,IP 最初要么非常接近其地址空间的顶部(有足够的空间进行远 JMP 调用以使其到达真正的 init 代码所在的位置),要么位于最底部(即 0)。

维基百科的 文章指出,8086 的设计目的是使以前处理器的汇编源代码很容易转换为与 8086 一起使用,但仅此而已。除此之外,没有尝试使其与以前的模型兼容。

于 2012-04-30T08:26:21.790 回答
0

1) 在 8085 中,复位后 pc 的值为 0000h。所以唤醒程序应该写在0000h位置,不能留空。

2) 在 8086 中,CS & lP 的复位值分别为 FFFFH & 0000h。所以 20 位物理地址为 FFFF0+0000=FFFF0H。它不应该是空的。唤醒程序(代码)始终在 ROM 中,ROM 应最后连接到 FFFF0H。

于 2015-03-20T17:19:12.100 回答