我正在阅读一些Pascal代码来调试硬件上的问题。我对Pascal并不熟悉,但用google搜索看起来似乎并不太难。
但是,我遇到了这个程序定义:
procedure RS232ConfigTask; far;
begin
RS232Config.Init;
RS232Config.Process;
end;
'far'关键字是什么意思?
我试着查一查。我在GNU Pascal网站上发现了这句话:
far指令可以附加到过程或函数标题,但GPC会忽略它。它只适用于Borland的兼容性。 (由于GNU编译器提供了一个平坦的内存模型,near和far指针之间的区别是无效的。)
我查找了近远点指针,发现它与分段内存模型有关,并在其他段中引用内存。
好。
这不是指针。那你为什么要把程序标记为“远”?
我注意到程序的调用方式如下:
procedure Init;
begin
CreateTask(@RS232ConfigTask, 4096, 'Config 232');
CreateTask(@RS485ConfigTask, 4096, 'Config 485');
end;
如果有帮助的话。
答案 0 :(得分:2)
用作过程指令,far
表示必须使用远程调用指令调用子例程,该远程调用指令修改代码段和指令指针。这也意味着调用指令将远指针(4个字节,段和偏移)推送到堆栈上。此外,为了返回调用者,子例程使用far ret指令,该指令期望将远指针作为返回地址推入堆栈。
对于Turbo Pascal,以下经验法则适用:从单元导出的子程序隐式使用如上所述的远程调用约定。其他子程序使用近调用约定(仅通过call / ret修改的偏移量)。为了覆盖此行为,引入了near
和far
过程指令。
答案 1 :(得分:0)
'Far'是一个旧的扩展,它意味着 - “这是一个指针,需要能够指向任何地址,而不仅仅是与使用它的代码在同一段中的东西”。
如果您想了解更多相关信息,可以查看维基百科页面并阅读相关内容。 Wikipedia page