x86开始执行的地址是什么?

时间:2010-10-23 14:35:13

标签: assembly x86

当8086或8088首次上电时,处理器开始执行哪个地址?我知道Z80从0开始,6809向FFFF寻找开始的地址,但我经常想知道x86是如何开始的。

编辑:

这假设没有BIOS干预。 I.E.如果我有自己的EEPROM启动,它应该放在RAM中以启动机器运行?

3 个答案:

答案 0 :(得分:9)

这实际上是一个比你可能意识到的要复杂得多的问题。在8086上,它非常简单 - 它在FFFF:0000(内存结束前16个字节)启动。

棘手的部分是在286或以上(即任何远程现代)。在这些情况下,它仍然在内存结束前启动16个字节,但当然使用24位寻址(286)或32位寻址(386+)时,物理地址是不同的。许多看起来并不复杂,但事实确实如此。复杂性源于处理器开始以实模式执行的事实,但该实际模式下处理器不能看到该地址(以及附近的所有地址)。因此,它最初在一个相当奇怪的模式下执行,从大多数角度来看它处于实模式,但是你看起来执行的地址的一些高位被忽略,而是基本上硬连接到1,所以物理地址的顶部处理器可以看到空间。然后,当您执行远程跳转时,处理器将静默切换到“正常”实模式。

BIOS以实模式启动,但通常在设置(最小)保护模式环境并切换到保护模式之前只执行该方式一小段时间。从那里,BIOS执行正常的开机自检,解压缩BIOS并将其复制到位于FFFF:0000的实际的RAM中,切换回实模式并在附加组件中执行代码外设ROM如果被标记为自动执行(通常在此过程中切换回保护模式,但在完成时返回实模式)。其中一个通常是硬盘控制器,它将具有从磁盘自动读取引导块的代码,并执行它以开始加载操作系统等。

答案 1 :(得分:0)

cs(代码选择器)寄存器设置为0xffffip(指令指针)设置为0x0000

这对应于物理内存位置0xffff0,但cs/ip的内容很重要,因为它们会影响您可以在没有远程跳转的情况下使用多少内存,以及如何生成代码需要它不是与位置无关的。

基本上,就像旧的8080天,你有一个64K块,你可以解决你的代码。一旦你改变cs,当然所有的变化。

答案 2 :(得分:-1)

8086 reset将程序计数器设置为FFFF0h。