我多次看到远指针用于 TSR。为什么这些 TSR 程序需要远指针以及为什么这些被认为对一般机器有害。
3 回答
远指针由两部分组成,段选择器和偏移量。
一般分段寻址的一个问题(仅适用于 16 位实模式,与后 DOS 计算机使用的 32 位保护模式不同)是物理内存中的单个位置可以从多个“远指针”访问。(这就是为什么在正常的 16 位编码中不鼓励使用它的原因)
维基百科给出的例子是有效的。
char far *p =(char far *)0x55550005;
char far *q =(char far *)0x53332225;
两者都指向地址 0x55555。资料来源: http ://en.wikipedia.org/wiki/Far_pointer
当一个程序在执行时,它并不总是需要指定一个段偏移量(它可以使用近指针),这是因为它正在使用的内存段已经被选中。
对于 TSR 程序,当必须将控制权转移回原始程序时,正在执行一个完全不同的程序。原始程序无法知道当前选择的段是什么,因此必须提供一个包含段和偏移量的完整“远指针”。 http://en.wikipedia.org/wiki/Terminate_and_Stay_Resident
由于 TSR 程序必须共享一个不能保证留在单个段中的地址空间,因此需要一个远地址(即包含两个 segmant:address )坐标来标识指针。这有点历史意义,因为据我所知,它在 DOS 下是有意义的。
谁说它们有害?他们只是比其他人需要更多的空间,因此在过去不受欢迎。此外,必须更改段寄存器才能使用它们。
如果您详细说明它们在 TSR 中的使用位置,我可能会说得更多。