【问题标题】:intel reset vector and documentation pedantics. Bits vs bytes英特尔重置向量和文档学究。位与字节
【发布时间】:2017-05-09 09:22:19
【问题描述】:

摘自英特尔开发文档第 3 卷第 9 节

硬件复位后获取并执行的第一条指令位于物理地址 FFFFFFF0H。
此地址比处理器最高物理地址低 16 个字节
EPROM 包含 软件初始化代码必须位于此地址。
在实地址模式下,地址 FFFFFFF0H 超出了处理器的 1 MB 可寻址范围。

处理器被初始化到这个起始地址如下。
CS寄存器有两部分:可见段 选择器部分和隐藏基地址部分。
在实地址模式下,基地址通常由 将 16 位段选择器值向左移动 4 位以产生 20 位基地址。然而,在一个 硬件复位,CS寄存器中的段选择器加载F000H,基地址加载 FFFF0000H。因此,起始地址是通过将基地址添加到 EIP 寄存器中的值(即 即,FFFF0000 + FFF0H = FFFFFFF0H)。

我的问题是为什么它在这里使用单词字节,而它似乎只对位有意义。假设 CPU 的物理限制是 0xFFFFFFFF,那么 0xFFFFFFF0 距离该限制 16 bits,而不是字节。现在如果英特尔闪存必须包含映射到顶部的每个地址的单字节值,那么我想我们可以调用 16 位字节?

【问题讨论】:

  • CPU 没有 bit 寻​​址,地址是字节地址,因此是 16 bytes 而不是 Intel 文档所说的位。
  • @WeatherVane 有。也许你的十六进制算术需要复习一下。包括0xFFFFFFF0,有16个十六进制值小于等于0xFFFFFFFF。每个值对应 1 个字节。因此,16 个字节...
  • @Gene 可能他已经按照你的编辑了他的评论,但是你说的和 WeatherVane 说的有什么矛盾?毕竟,你们都同意 16 字节在这里是正确的。
  • @Downvoter 我一点也不反对他。我说“风向标有它”作为我的前三个字。我只是推测 OP 的问题是十六进制算术而不是位与字节。
  • @Gene 那么对不起,我以为您针对的是 WeatherVane,质疑 CPU 具有字节寻址,如“CPU 没有位寻址,有吗? "你只是放错了一个点而不是一个问号。我以为你的全部评论都是针对 WeatherVane 的。解释会有什么不同。

标签: assembly x86 firmware real-mode


【解决方案1】:

来自Intel® 64 and IA-32 architectures software developer's manual volume 1: Basic architecture,第 30 页第 1.3.4 节:

处理器使用字节寻址。这意味着内存是作为字节序列组织和访问的。无论是访问一个还是多个字节,都使用一个字节地址来定位字节或字节内存。

基本上,字节是内存中最小的可寻址单元。要确定单个位的值,需要获取包含其值的整个字节。

0xFFFFFFFF0xFFFFFFF0 之间的区别是 0x0F 或十进制的 15。当我们在计算中包含 0xFFFFFFF0 的字节时,它是 16。内存是字节可寻址的,因此它是“处理器最高物理地址以下 16 个字节”。


坦率地说,我不知道您是如何得出这 16 个的。 16 位可以用四个十六进制数字表示(一个十六进制数字对应一个半字节,即 4 位),在您的引文中我看不到任何与此相关的任何地方。

【讨论】:

  • 你是对的,它应该是 4 位但是还有 16 个地址。
  • 不相关,我假设内存地址不针对单个位。所以内存地址 0x0 将只有一个位,而不是 8 位或 16 位或更多。
  • 我不知道如何解释,除了我猜是对词的理解有误。你可以说地址在下面半个字节......这很有意义,不是吗?
  • @marshalcraft 内存地址总是寻址一个字节。一个字节中的位数通常为 8,但可能会有所不同,具体取决于实际实现。
  • 在大多数处理器中,每个地址都指向一个字节,但在某些处理器中,每个地址指向一个字。例如一些 TI 处理器不可字节寻址。
猜你喜欢
  • 2014-04-07
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 2011-10-31
相关资源
最近更新 更多