2011-04-07 48 views
3

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

回答

4

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

(我没有尝试这样做。)

+0

其实,IIRC 16/32正交于真正的/保护(286分割,没有16位模式),前缀66H只是选择另一种(16/32)为以下insn。 – ninjalj 2011-04-07 18:59:20

+0

谢谢@Thomas。这样可行。我们还发现,在前面的一个mov [GlobalLongwordVariable]中,一个66美元的斧头也应该可以工作,而且它的确如此。 – rossmcm 2011-04-07 21:42:53

+0

@ninjalj:是的。 0x66前缀允许从16位代码访问32位寄存器。实模式和VM86模式(实模式仿真)都是16位代码(在VM86模式下,WinXP DOS框运行代码)。但是,您也可以拥有受保护的16位模式(Windows 3.0称为“标准模式”)。 – 2011-04-08 12:30:59

0

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

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

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