猿问

远指针和近指针有什么区别?

谁能告诉我C语言中的far指针和near指针之间的区别?



慕尼黑8549860
浏览 568回答 3
3回答

有只小跳蛙

在16位x86分段存储器体系结构上,使用四个寄存器来引用各个段:DS→数据段CS→代码段SS→堆栈段ES→额外细分在此体系结构上写了一个逻辑地址segment:offset。现在回答这个问题:近指针指向(作为偏移量)当前段。远指针使用段信息和偏移量来跨段指向。因此,要使用它们,必须将DS或CS更改为指定值,将取消对内存的引用,然后恢复DS / CS的原始值。请注意,对它们的指针算术运算不会修改指针的段部分,因此,溢出偏移量只会将其环绕。然后是巨大的指针,这些指针被规范化为具有给定地址的最大分段(与far指针相反)。在32位和64位体系结构上,内存模型使用的段不同,或者根本不使用。

烙印99

由于没有人提到DOS,所以让我们忘记旧的DOS PC计算机,并从一般的角度来看它。然后,非常简化,它是这样的:任何CPU都有数据总线,这是CPU可以在一条指令中处理的最大数据量,即等于其寄存器的大小。数据总线宽度以位表示:8位或16位或64位等。这是术语“ 64位CPU”的来源-它表示数据总线。任何CPU都有地址总线,也具有以位表示的特定总线宽度。CPU可以直接访问的计算机中的任何存储单元都具有唯一地址。地址总线足够大,可以覆盖您拥有的所有可寻址内存。例如,如果计算机具有65536字节的可寻址内存,则可以使用16位地址总线2 ^ 16 = 65536覆盖这些内容。通常,但并非总是如此,数据总线宽度与地址总线宽度一样宽。如果它们的大小相同,那就太好了,因为这样可以使CPU指令集和为其编写的程序更加清晰。如果CPU需要计算地址,则该地址要足够小以适合CPU寄存器(当涉及到地址时通常称为索引寄存器)可以方便使用。非标准关键字far和near用于在需要寻址超出常规CPU地址总线宽度的内存的系统上描述指针。例如,具有16位数据总线的CPU也具有16位地址总线可能会很方便。但是同一台计算机可能还需要超过2 ^ 16 = 65536字节= 64kB的可寻址内存。然后,CPU通常会有特殊的指令(速度稍慢),这使它可以处理超过64kb的内存。例如,CPU可以将其大内存划分为多个n 页面(有时也称为存储体,段和其他此类术语,这可能意味着一个CPU与另一个CPU的含义不同),其中每个页面为64kB。然后,它将有一个“页面”寄存器,在寻址该扩展存储器之前,必须首先对其进行设置。同样,从扩展内存中的子例程调用/返回时,它将具有特殊的指令。为了使C编译器在处理此类扩展内存时生成正确的CPU指令,发明了非标准near和far关键字。非标准不是C标准指定的,但是它们实际上是行业标准,几乎每个编译器都以某种方式支持它们。far指位于扩展存储器中的存储器,超出了地址总线的宽度。由于它引用地址,因此在声明指针时经常使用它。例如:int * far x;意思是“给我一个指向扩展内存的指针”。然后,编译器将知道应该生成访问此类内存所需的特殊指令。同样,使用的函数指针far将生成特殊指令以跳转到扩展内存或从扩展内存返回。如果不使用far,则会得到一个指向普通可寻址内存的指针,并且最终会指向完全不同的东西。near主要是为了与...保持一致far; 它引用可寻址内存中的任何内容,等同于常规指针。因此,它主要是一个无用的关键字,除了在极少数情况下要确保将代码放置在标准可寻址内存中之外。然后,您可以将某些内容明确标记为near。最典型的情况是在底层硬件编程中编写中断服务程序。硬件从固定宽度的中断向量调用它们,该宽度与地址总线宽度相同。这意味着中断服务程序必须位于标准可寻址存储器中。最有名的使用far和near也许是提到的老MS-DOS的PC,这是目前被视为比较古老,因此温和的兴趣。但是这些关键字也存在于更现代的CPU上!最值得注意的是在嵌入式系统中,市场上几乎每个8位和16位微控制器系列都存在这种嵌入式系统,因为这些微控制器通常具有16位的地址总线宽度,但有时超过64kB内存。每当您有一个需要寻址地址总线宽度以外的内存的CPU时,便需要far和near。通常,这种解决方案不受欢迎,因为对其进行编程非常麻烦,并且始终考虑扩展内存。推动开发64位PC的主要原因之一实际上是32位PC的内存使用量开始达到地址总线极限:它们只能寻址4GB的RAM。2 ^ 32 = 42.9十亿字节= 4GB 为了能够使用更多的RAM,然后选择使用某些麻烦的扩展内存解决方案(例如在DOS时代),或者将计算机(包括其地址总线)扩展到64位。

波斯汪

指针基本上保存地址。众所周知,英特尔内存管理分为四个部分。因此,当指针指向的地址在同一段内时,它就是近指针,因此它仅需要2个字节的偏移量。另一方面,当指针指向该段之外的地址(即在另一个段中)时,该指针就是一个远指针。它由4个字节组成:两个用于段,两个用于偏移量。
随时随地看视频慕课网APP
我要回答