【问题标题】:Accessing high Performance Counter in 16-bit Turbo Pascal在 16 位 Turbo Pascal 中访问高性能计数器
【发布时间】:2011-07-31 08:52:45
【问题描述】:

我正在尝试在 WinXP DOS 机器中运行的 16 位 Turbo Pascal 7 程序(不要问...)中使用高性能计数器。我可以使用内联 $0F、$31 执行 RDTSC 指令,并且将 AX 和 DX 的内容设置为看起来合理的值,但是如何访问 EAX、EDX 的上半部分并将结果写入 2 个长字全局变量?

【问题讨论】:

    标签: assembly windows-xp inline-assembly rdtsc turbo-pascal


    【解决方案1】:

    如果我正确阅读了我的文档,那么您可以通过在操作码上使用 0x66 前缀从实模式访问 32 位寄存器。因此,内联 "$66 $50" 应该具有以下效果:它将 EAX 作为 32 位值推入堆栈。然后,您只需将下半部分和上半部分作为两个普通(16 位)pop 操作码弹出(您将首先获得下半部分)。对于 EDX,请使用“$52”而不是“$50”。

    (这个我没试过。)

    【讨论】:

    • 其实IIRC 16/32与real/protected是正交的(286有分段,没有16位模式),前缀66h只是为后面的insn选择另一个(16/32)。跨度>
    • 谢谢@Thomas。这样可行。我们还认为,在 mov [GlobalLongwordVariable] 之前,带有 $66 的 ax 应该也可以工作,而且确实如此。
    • @ninjalj:是的。 0x66 前缀允许从 16 位代码访问 32 位寄存器。实模式和 VM86 模式(实模式仿真)是 16 位代码(WinXP DOS 机器在 VM86 模式下运行代码)。但您也可以拥有受保护的 16 位模式(Windows 3.0 称为“标准模式”)。
    【解决方案2】:

    要在 DOS 中使用 32 位寄存器,您需要 DOS 扩展器或平面实模式。第一个可以为保护模式编写程序(您需要在某处切换代码生成模型),后者将是一种 32 位实模式。我怀疑它是否可以在 DOS 机器中工作,也许 DOS 模拟器可以工作。

    AFAIK(15 年...)Borland Pascal 有自己的 DOS 扩展程序,RTM.EXE 或其他东西。

    切换到平面实模式: http://www.assembly.happycodings.com/code54.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多