什么是FAR PASCAL?

我想知道为什么在某些源代码中存在像FAR和PASCAL这样的宏。 他们的意思和做法是什么? 谢谢

  • PASCAL:它与调用约定有关 。 参数以从左到右的顺序(与cdecl相反)被压入堆栈,并且被调用者负责在返回之前平衡堆栈。

    此调用约定在以下16位API中很常见:OS / 2 1.x和Microsoft Windows 3.x. 关于它是否被Borland Delphi 1.x使用存在争议

  • FAR:在分段架构计算机中, 远指针是包含段选择器的指针,使得可以指向当前段之外的地址。

为了完整性,FAR和PASCAL是预处理器宏,当为16位系统编译时,会扩展为声明调用约定和指针大小所必需的关键字。 在32位系统上,它们通常会扩展为空(除非您有一个奇怪的默认调用约定)。 保留宏以实现向后兼容{hat / tip:来自Adrian McCarthy的评论}

在这里记忆,

当堆内存被分段时,FAR可以回落到16位。 NEAR数据的大小和速度有限,允许FAR更大但更昂贵。

据我所知,在32位的土地上,它是一个崩溃到没有的宏。

PASCAL是一个调用约定,也在16位日内大量使用。 它已被stdcall取代。

两者都是为了向后兼容而留下的。

FAR已经过时; 它在16位代码中用于指示可以寻址整个地址空间的指针,而不仅仅是当前段的16位偏移量。

PASCAL是一个召集会议。 正如维基百科所描述的:

参数以从左到右的顺序(与cdecl相反)被压入堆栈,并且被调用者负责在返回之前平衡堆栈。

此调用约定在以下16位API中很常见:OS / 2 1.x,Microsoft Windows 3.x和Borland Delphi版本1.x.

当我们有近(16位)和远(32位)指针时, FAR是16位时代的延续。

PASCAL是一个召集会议。 我相信它现在相当于stdcall

这是一个旧的召集会议……

FARinheritance自处理器寄存器太小而无法保存跳转目标的完整地址的时间。 因此,处理器有两种类型的跳转,具体取决于目标与当前程序计数器的“距离”。

PASCAL描述了堆栈上的参数顺序,它告诉该函数使用Pascal编程语言描述的顺序,它与C不同(非常旧版本的操作系统,如使用Pascal开发的MacOS和Windows)。

它可能是16位时代留下的一些冗余/过时的编码。

FAR用于16位应用程序,表明该地址需要16位以上。

PASCAL(altion)是一种转换类型,它允许编译器知道堆栈的排列方式(使用PASCAL调用约定),以便编译器可以将相应的参数传递给函数或从函数传递。

HTH

特别是PASCAL说函数的参数是按从左到右的顺序传递的,这减少了代码的大小(因为调用者知道堆栈有多大,所以可以清理它)

C stdcall从右到左传递参数,这意味着您可以拥有可变数量的参数,但需要更多代码才能进行清理。