【问题标题】:How can two different far pointers contain two different addresses but refer to the same memory location?两个不同的远指针如何包含两个不同的地址但引用相同的内存位置?
【发布时间】:2017-05-14 03:11:02
【问题描述】:

我在一本书中遇到过这个问题 - 两个不同的 Far 指针是否可以包含两个不同的地址但引用内存中的相同物理位置。答案是“是的”。但是,对于涉及 NearHuge 指针的相同问题,答案是“NO”。

附:不要抛弃这个问题,因为现在 Far、Near 和 Huge 指针已经过时了。

【问题讨论】:

  • 什么是远指针?你能提供一个标准的参考吗?并添加大指针和近指针的引用。还有 - 哪个问题??
  • 请参考链接 - stackoverflow.com/questions/8727122/… 讨论远大指针。有关远近指针,请参阅 -stackoverflow.com/questions/1749904/… 中的讨论。
  • 哦,我很了解这些术语。但是这些指针是什么没有标准定义!它不是标准C(实际上它们是违反标准的)。不同的旧架构使用这些术语来表示非常不同的概念。没有上下文,您的问题毫无意义。

标签: c pointers assembly x86 microprocessors


【解决方案1】:

要使用far 指针,您必须使用原始 80x86 芯片或兼容模式下的现代芯片。一个far指针由一个段号和一个偏移量组成,但是不同的段号指向重叠的地址,所以段号和偏移的不同组合可以指向同一个物理地址。

段号乘以 16 并加上偏移量以产生物理地址。因此:

 segment     offset        address
 0x100       0x0030        0x1030
 0x101       0x0020        0x1030

等等

【讨论】:

  • 你的意思是不同的段使用相同的内存地址吗?那会很混乱。如果编译器希望将变量存储在已占用段中的第二个程序中,那么一个程序中的“堆栈溢出错误”将导致与它同时运行的另一个程序中的赋值错误!
  • 告诉英特尔它很乱。在大多数情况下,80386 和更高版本的芯片避免了炼狱,但在核心部分,这就是“实模式”仍然有效的方式(AFAIK——如果不是这样的话,它确实可以工作很长时间)。跨度>
  • 还有其他架构将这些术语用于不同的概念。这样的概念是违反标准的。我们需要更多背景信息。
  • 还有哪些其他架构?他们中有多少人写过关于他们的书,初学者可能会阅读?从某种意义上说,这无关紧要。我已经概述了这种现象发生的一种方式。也可能有其他人,但没关系。
  • @JonathanLeffler:内存不足:H8(瑞萨,仍在使用),大约 6800 个系列,包括他们的 Sxx 当前版本(广泛使用),其他一些较旧的架构。在 MSP430X 上,不同的指针宽度也有意义(但不确定它们是如何被各种编译器调用的)。没有关于这本书的年代以及它是哪种架构的信息。现在有很多人对“历史”系统感兴趣。
猜你喜欢
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
相关资源
最近更新 更多