我试图在WinXP DOS盒子中运行的16位Turbo Pascal 7程序(不要问…)中使用高性能计数器。我可以执行RDTSC指令与内联$0F, $31和AX和DX的内容设置为什么看起来像合理的值,但我怎么能访问EAX, EDX的上半部分,并将结果写入2长字全局变量?
如果我正确地阅读了我的文档,那么您可以通过对操作码使用0x66前缀来从实模式访问32位寄存器。因此,内联"$66 $50"应该有以下效果:它将EAX作为32位值压入堆栈。然后,您只需将下半部分和上半部分作为两个正常的(16位)pop
操作码(您将首先获得下半部分)。对于EDX,使用"$52"而不是"$50"。
(我还没试过)
要在DOS中使用32位寄存器,您需要一个DOS扩展器或平面实模式。第一个将使编写保护模式的程序成为可能(您需要在某处切换代码生成模型),后者将是一种32位实模式。我怀疑它是否能在DOS盒中工作,也许DOS模拟器可以工作。
AFAIK(15年…)Borland Pascal有自己的DOS扩展器,RTM.EXE之类的。
切换到平实模式:http://www.assembly.happycodings.com/code54.html