在 PC 上,总是涉及一些地址解码逻辑,因为物理地址空间中有一些“洞/窗口”,通过这些“洞/窗口”可以访问 BIOS ROM 和 I/O 设备(例如视频卡)而不是 RAM。出于兼容性原因,这是设计使然,因此较旧的程序仍可以在较新的计算机上运行。
至于CPU在复位后开始执行的初始地址,如果你看一下文档,你会看到奔腾级CPU是这样开始的:
EIP=0xFFF0
CS.Selector=0xF000
CS.Base=0xFFFF0000
如果您遵循正常的实模式寻址方案,则物理地址应为 CS.Selector*16+IP,或者替换值后为 0xFFFF0。但是,CPU 实际使用 CS.Base+(E)IP 计算地址(在真实和 16/32 位保护模式下,而不是在虚拟 8086 或 64 位保护模式下),因此 CPU 请求的第一个地址从内存中将是 0xFFFFFFF0。您无法使用远跳转到 ROM 中那个高地址的代码可能是因为加载到 CS 中会将 CS.Base 重置为 16 * CS.Selector 的新值。因此,例如,跳转到 0xF000:0xFFF0 会将控制权转移到 0xFFFF0 而不是 0xFFFFFFF0 并且除非 ROM 也映射到内存中的那个低位置并且其中的代码适合在 CS(.Selector)=0xF000 下运行,它不会运行。
此外,如果 PC 被限制为最多 16MB(如在 i80286 和 i80386SX 上)或 4GB(如在 i80386DX/原始上),则 CPU 及其周围的电路都不必支持所有 32 个(或更多)地址线i80386 和 i80486)或 2 个40-52字节(在支持 64 位的 Pentium 级 CPU 上),如果是这种情况,如果忽略物理地址空间中的一些高位,则可以说执行有效地开始于地址低于理论最大值 - 16,例如 0x00FFFFF0 (i80286/i80386SX)。
如果您需要解决电路板的问题,请参阅其文档和原理图以了解 ROM 如何映射到其上的物理地址空间。