我想知道为什么在某些源代码中存在像FAR和PASCAL这样的宏。他们的意思和做法是什么? 感谢
答案 0 :(得分:19)
PASCAL:它与calling convention有关。参数以从左到右的顺序(在cdecl的反面)推入堆栈,并且被调用者负责在返回之前平衡堆栈。
此调用约定在以下16位API中很常见:OS / 2 1.x和Microsoft Windows 3.x.关于它是否被Borland Delphi 1.x
FAR:在分段架构计算机中,far pointer是一个包含段选择器的指针,可以指向当前段之外的地址。
为了完整性,FAR和PASCAL是预处理器宏,当为16位系统编译时,会扩展为声明调用约定和指针大小所必需的关键字。在32位系统上,它们通常会扩展为空(除非你有一个奇怪的默认调用约定)。保留宏以实现向后兼容{hat / tip:来自Adrian McCarthy}
的评论
答案 1 :(得分:9)
在此处记忆,
当堆内存被分段时,FAR会回落到16位天。 NEAR数据的大小和速度有限,允许FAR更大但更昂贵。
据我所知,在32位的土地上,它是一个崩溃到没有的宏。
PASCAL是一种调用约定,在16位日内也大量使用。它已被stdcall取代。
两者都是为了向后兼容而留下的。
答案 2 :(得分:6)
FAR已经过时;它在16位代码中用于指示可以解决整个地址空间的指针,而不仅仅是当前段的16位偏移量。
PASCAL是一个召集会议。正如Wikipedia所描述的那样:
参数以从左到右的顺序(与cdecl相反)被压入堆栈,被调用者负责在返回之前平衡堆栈。
此调用约定在以下16位API中很常见:OS / 2 1.x,Microsoft Windows 3.x和Borland Delphi 1.x版。
答案 3 :(得分:3)
FAR
是16位时代的延迟,当时我们有近(16位)和远(32位)指针。
PASCAL
是一个调用约定。我相信它现在相当于stdcall
。
答案 4 :(得分:2)
这是一个旧的召集会议......
FAR继承自处理器寄存器太小而无法保存跳转目标的完整地址的时间。因此,处理器有两种类型的跳转,具体取决于目标与当前程序计数器的“距离”。
PASCAL描述了堆栈上的参数顺序,它告诉该函数使用Pascal编程语言描述的顺序,这与C语言不同(非常旧版本的操作系统,如使用Pascal开发的MacOS和Windows)。
答案 5 :(得分:1)
这可能是16位时代留下的一些冗余/过时的编码。
FAR用于16位应用程序,表明该地址需要超过16位。
PASCAL(altion)是一种转换类型,它允许编译器知道堆栈的排列方式(使用PASCAL调用约定),以便编译器可以将相应的参数传递给函数或从函数传递。
HTH
答案 6 :(得分:1)
具体来说,PASCAL说函数的参数是按从左到右的顺序传递的,这减少了代码的大小(因为调用者知道堆栈有多大,所以可以清理它)
C stdcall从右到左传递参数,这意味着您可以拥有可变数量的参数,但需要更多代码才能进行清理。