io - 对为旧计算机编写的延迟函数进行逆向工程

标签 io delay reverse-engineering pascal turbo-pascal

我正在尝试移植我收到的一些旧 Pascal 代码,其目的是控制一个数字 I/O 卡,但我遇到了一个涉及等待函数的障碍。每当发送信号时,程序员都会做这样的事情

[Set the port status]
LoopDelay([a long integer])
[Set the next port status]
LoopDelay([next long integer])  
etc.

LoopDelay 看起来像这样:

procedure loopdelay(looping:longint);
var
  counter,count : longint;
begin
  for counter:=1 to looping do
    inc(count);
end {loopdelay};

在我看来,他好像根据处理器速度做了一些数学运算,并计算出他需要迭代多少次循环才能等待一定的时间。我怎样才能知道等待了多长时间?

附加信息: 该处理器是 80 年代末/90 年代初的 486(根据维基百科,频率在 20 到 66 MHz 之间)。计算机运行 DOS 或早期的 Windows,代码是用 Turbo Pascal 7 编译的。传递给 loopdelay 的两个常量是 1266 和 6328。

我应该很快就会去参观这台机器,希望到时候我能找到确切的处理器。理想情况下,我想要一个可以插入时钟速度的公式。

最佳答案

在实际的 Pascal 实现中,您可以使用延迟程序,无需延迟循环。但是应该延迟多久呢?我可以想到四种获取此信息的方法。

  1. 最终您可以找到卡的文档或其中列出了必要延迟的部分。

  2. 您可以找到一台旧 PC 并测量一个计数非常大的延迟循环。

  3. 你反汇编 loopdelay 程序,查找 486 手册并手动计算循环所需的时间。

  4. 尝试错误并增加良好的安全边际。

关于io - 对为旧计算机编写的延迟函数进行逆向工程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22664714/

相关文章:

linux - 如何在 linux 驱动程序模块中暂停 100 多毫秒?

obfuscation - 有没有像JavaScript的小工具(deobfuscator)这样的东西?

Java I/O 和 HashMap

performance - Fortran 未格式化 I/O 优化

windows - 为什么另一个线程中的阻塞 IO 会阻止 CreateWindowEx() 返回

java - 如何查明从流中读取了多少个字符或字节?

ios - Swift 中的延迟/ sleep 不起作用

javascript - 脚本需要等待元素加载

.net - 想要一个反编译混淆的.NET代码的工具

c++ - DLL 注入(inject)的最佳实践?