Assembly 在16位Turbo-Pascal中访问高性能计数器

Assembly 在16位Turbo-Pascal中访问高性能计数器,assembly,windows-xp,inline-assembly,rdtsc,turbo-pascal,Assembly,Windows Xp,Inline Assembly,Rdtsc,Turbo Pascal,我试图在WinXP DOS环境下运行的16位Turbo Pascal 7程序(不问…)中使用高性能计数器。我可以使用内联$0F、$31执行RDTSC指令,并且AX和DX的内容设置为看起来合理的值,但是我如何访问EAX、EDX的上半部分并将结果写入2个长字全局变量?要在DOS中使用32位寄存器,您需要DOS扩展器或平实模式。第一种模式可以为受保护模式编写程序(您需要在某个地方切换代码生成模式),第二种模式是32位实模式。我怀疑它是否能在DOS环境下工作,也许DOS模拟器能工作 AFAIK(15年…

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

要在DOS中使用32位寄存器,您需要DOS扩展器或平实模式。第一种模式可以为受保护模式编写程序(您需要在某个地方切换代码生成模式),第二种模式是32位实模式。我怀疑它是否能在DOS环境下工作,也许DOS模拟器能工作

AFAIK(15年…)Borland Pascal有自己的DOS扩展器RTM.EXE或其他东西

切换到平坦实模式:

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


(我没有试过。)

实际上,IIRC 16/32与实数/保护数正交(286有分段,没有16位模式),前缀66h只是为以下insn选择另一个(16/32)。谢谢@Thomas。这很有效。我们还认为,在mov[GlobalLongwordVariable]之前,带有$66的ax也应该可以工作,它确实可以。@ninjalj:是的。0x66前缀允许从16位代码访问32位寄存器。实模式和VM86模式(实模式仿真)是16位代码(WinXP DOS框在VM86模式下运行代码)。但您也可以使用受保护的16位模式(Windows 3.0称之为“标准模式”)。