1

为什么在 32 位编译器中没有近、远和巨大指针的概念?据我了解,在 16 位 8086 架构编译器上创建的程序可以有 1 mb 大小,其中数据段、图形段等都在那里。要访问所有这些段并维护指针增量概念,我们需要这些不同的指针,但为什么在 32 位中它不是必需的?

4

2 回答 2

8

32 位编译器可以使用单个 32 位指针来寻址可供程序(或操作系统)使用的整个地址空间。不需要基于,因为指针足够大,可以寻址可用地址空间中的任何字节。

理论上可以设想一个寻址 > 4GB 内存的 32 位操作系统(因此需要一个与 16 位操作系统通用的段系统),但实际情况是 64 位系统在需要复杂性出现之前就可用.

于 2013-02-23T22:07:49.923 回答
2

为什么在 32 位编译器中没有近、远和巨大指针的概念?

这取决于平台和编译器。Open Watcom C/C++ 支持 16 位代码中的近、远和巨大指针以及 32 位代码中的近和远指针。

据我所知,在 16 位 8086 架构编译器上创建的程序可以有 1 mb 大小,其中存在数据段图形段等。要访问所有这些段并维护指针增量概念,我们需要这些不同的指针,但为什么在 32 位中它不是必需的?

因为在大多数情况下,接近 32 位的指针足以覆盖整个地址空间(所有 2个 32字节 = 4 GB),而对于近或远的 16 位指针则不是这种情况,正如您所说的那样只能覆盖最多 1 MB 内存(严格来说,在 80286+ 的 16 位保护模式下,您可以使用 16 位远指针来寻址至少 16 MB 的内存,这是因为这些指针是相对于段的开头的并且 80286+ 上的段可以在前 16 MB 的任何位置开始,因为全局描述符表 ( GDT) 或本地描述符表 ( LDT) 中的段描述符为段的起始地址保留 24 位(2 24字节 = 16 MB)) .

于 2013-02-23T22:14:11.213 回答