2011-04-07 79 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